diff options
Diffstat (limited to 'core')
159 files changed, 2438 insertions, 2469 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 6ae21eb..680feae 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -108,7 +108,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM try { getDefault().broadcastIntent( null, intent, null, null, Activity.RESULT_OK, null, null, - null /*permission*/, appOp, false, true, userId); + null /*permission*/, appOp, null, false, true, userId); } catch (RemoteException ex) { } } @@ -458,12 +458,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM Bundle resultExtras = data.readBundle(); String perm = data.readString(); int appOp = data.readInt(); + Bundle options = data.readBundle(); boolean serialized = data.readInt() != 0; boolean sticky = data.readInt() != 0; int userId = data.readInt(); int res = broadcastIntent(app, intent, resolvedType, resultTo, resultCode, resultData, resultExtras, perm, appOp, - serialized, sticky, userId); + options, serialized, sticky, userId); reply.writeNoException(); reply.writeInt(res); return true; @@ -2991,9 +2992,9 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } public int broadcastIntent(IApplicationThread caller, - Intent intent, String resolvedType, IIntentReceiver resultTo, + Intent intent, String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData, Bundle map, - String requiredPermission, int appOp, boolean serialized, + String requiredPermission, int appOp, Bundle options, boolean serialized, boolean sticky, int userId) throws RemoteException { Parcel data = Parcel.obtain(); @@ -3008,6 +3009,7 @@ class ActivityManagerProxy implements IActivityManager data.writeBundle(map); data.writeString(requiredPermission); data.writeInt(appOp); + data.writeBundle(options); data.writeInt(serialized ? 1 : 0); data.writeInt(sticky ? 1 : 0); data.writeInt(userId); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 6fb997e..2406985 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -43,7 +43,7 @@ public class ActivityOptions { * A long in the extras delivered by {@link #requestUsageTimeReport} that contains * the total time (in ms) the user spent in the app flow. */ - public static final String EXTRA_USAGE_TIME_REPORT = "android.usage_time"; + public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time"; /** * A Bundle in the extras delivered by {@link #requestUsageTimeReport} that contains @@ -56,67 +56,67 @@ public class ActivityOptions { * The package name that created the options. * @hide */ - public static final String KEY_PACKAGE_NAME = "android:packageName"; + public static final String KEY_PACKAGE_NAME = "android:activity.packageName"; /** * Type of animation that arguments specify. * @hide */ - public static final String KEY_ANIM_TYPE = "android:animType"; + public static final String KEY_ANIM_TYPE = "android:activity.animType"; /** * Custom enter animation resource ID. * @hide */ - public static final String KEY_ANIM_ENTER_RES_ID = "android:animEnterRes"; + public static final String KEY_ANIM_ENTER_RES_ID = "android:activity.animEnterRes"; /** * Custom exit animation resource ID. * @hide */ - public static final String KEY_ANIM_EXIT_RES_ID = "android:animExitRes"; + public static final String KEY_ANIM_EXIT_RES_ID = "android:activity.animExitRes"; /** * Custom in-place animation resource ID. * @hide */ - public static final String KEY_ANIM_IN_PLACE_RES_ID = "android:animInPlaceRes"; + public static final String KEY_ANIM_IN_PLACE_RES_ID = "android:activity.animInPlaceRes"; /** * Bitmap for thumbnail animation. * @hide */ - public static final String KEY_ANIM_THUMBNAIL = "android:animThumbnail"; + public static final String KEY_ANIM_THUMBNAIL = "android:activity.animThumbnail"; /** * Start X position of thumbnail animation. * @hide */ - public static final String KEY_ANIM_START_X = "android:animStartX"; + public static final String KEY_ANIM_START_X = "android:activity.animStartX"; /** * Start Y position of thumbnail animation. * @hide */ - public static final String KEY_ANIM_START_Y = "android:animStartY"; + public static final String KEY_ANIM_START_Y = "android:activity.animStartY"; /** * Initial width of the animation. * @hide */ - public static final String KEY_ANIM_WIDTH = "android:animWidth"; + public static final String KEY_ANIM_WIDTH = "android:activity.animWidth"; /** * Initial height of the animation. * @hide */ - public static final String KEY_ANIM_HEIGHT = "android:animHeight"; + public static final String KEY_ANIM_HEIGHT = "android:activity.animHeight"; /** * Callback for when animation is started. * @hide */ - public static final String KEY_ANIM_START_LISTENER = "android:animStartListener"; + public static final String KEY_ANIM_START_LISTENER = "android:activity.animStartListener"; /** * For Activity transitions, the calling Activity's TransitionListener used to @@ -124,15 +124,18 @@ public class ActivityOptions { * complete. */ private static final String KEY_TRANSITION_COMPLETE_LISTENER - = "android:transitionCompleteListener"; - - private static final String KEY_TRANSITION_IS_RETURNING = "android:transitionIsReturning"; - private static final String KEY_TRANSITION_SHARED_ELEMENTS = "android:sharedElementNames"; - private static final String KEY_RESULT_DATA = "android:resultData"; - private static final String KEY_RESULT_CODE = "android:resultCode"; - private static final String KEY_EXIT_COORDINATOR_INDEX = "android:exitCoordinatorIndex"; - - private static final String KEY_USAGE_TIME_REPORT = "android:usageTimeReport"; + = "android:activity.transitionCompleteListener"; + + private static final String KEY_TRANSITION_IS_RETURNING + = "android:activity.transitionIsReturning"; + private static final String KEY_TRANSITION_SHARED_ELEMENTS + = "android:activity.sharedElementNames"; + private static final String KEY_RESULT_DATA = "android:activity.resultData"; + private static final String KEY_RESULT_CODE = "android:activity.resultCode"; + private static final String KEY_EXIT_COORDINATOR_INDEX + = "android:activity.exitCoordinatorIndex"; + + private static final String KEY_USAGE_TIME_REPORT = "android:activity.usageTimeReport"; /** @hide */ public static final int ANIM_NONE = 0; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index e21c04a..828dc0a 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5375,6 +5375,7 @@ public final class ActivityThread { } public static void main(String[] args) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain"); SamplingProfilerIntegration.start(); // CloseGuard defaults to true and can be quite spammy. We @@ -5409,6 +5410,8 @@ public final class ActivityThread { LogPrinter(Log.DEBUG, "ActivityThread")); } + // End of event ActivityThreadMain. + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); diff --git a/core/java/android/app/AssistContent.java b/core/java/android/app/AssistContent.java index 0df9ce5..ad2ba39 100644 --- a/core/java/android/app/AssistContent.java +++ b/core/java/android/app/AssistContent.java @@ -33,6 +33,7 @@ import android.os.Parcelable; public class AssistContent { private boolean mIsAppProvidedIntent = false; private Intent mIntent; + private String mStructuredData; private ClipData mClipData; private Uri mUri; private final Bundle mExtras; @@ -125,6 +126,22 @@ public class AssistContent { } /** + * Sets optional structured data regarding the content being viewed. The provided data + * must be a string represented with <a href="http://json-ld.org/">JSON-LD</a> using the + * <a href="http://schema.org/">schema.org</a> vocabulary. + */ + public void setStructuredData(String structuredData) { + mStructuredData = structuredData; + } + + /** + * Returns the current {@link #setStructuredData}. + */ + public String getStructuredData() { + return mStructuredData; + } + + /** * Set a web URI associated with the current data being shown to the user. * This URI could be opened in a web browser, or in the app as an * {@link Intent#ACTION_VIEW} Intent, to show the same data that is currently @@ -163,6 +180,9 @@ public class AssistContent { if (in.readInt() != 0) { mUri = Uri.CREATOR.createFromParcel(in); } + if (in.readInt() != 0) { + mStructuredData = in.readString(); + } mIsAppProvidedIntent = in.readInt() == 1; mExtras = in.readBundle(); } @@ -187,6 +207,12 @@ public class AssistContent { } else { dest.writeInt(0); } + if (mStructuredData != null) { + dest.writeInt(1); + dest.writeString(mStructuredData); + } else { + dest.writeInt(0); + } dest.writeInt(mIsAppProvidedIntent ? 1 : 0); dest.writeBundle(mExtras); } diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index 02e26a5..903411e 100644 --- a/core/java/android/app/BackStackRecord.java +++ b/core/java/android/app/BackStackRecord.java @@ -28,7 +28,6 @@ import android.transition.TransitionSet; import android.util.ArrayMap; import android.util.Log; import android.util.LogWriter; -import android.util.Pair; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; @@ -1005,13 +1004,20 @@ final class BackStackRecord extends FragmentTransaction implements outFragment.getExitTransition()); } - private static Transition getSharedElementTransition(Fragment inFragment, Fragment outFragment, - boolean isBack) { + private static TransitionSet getSharedElementTransition(Fragment inFragment, + Fragment outFragment, boolean isBack) { if (inFragment == null || outFragment == null) { return null; } - return cloneTransition(isBack ? outFragment.getSharedElementReturnTransition() : - inFragment.getSharedElementEnterTransition()); + Transition transition = cloneTransition(isBack + ? outFragment.getSharedElementReturnTransition() + : inFragment.getSharedElementEnterTransition()); + if (transition == null) { + return null; + } + TransitionSet transitionSet = new TransitionSet(); + transitionSet.addTransition(transition); + return transitionSet; } private static ArrayList<View> captureExitingViews(Transition exitTransition, @@ -1070,7 +1076,7 @@ final class BackStackRecord extends FragmentTransaction implements * capturing the final state of the Transition.</p> */ private ArrayList<View> addTransitionTargets(final TransitionState state, - final Transition enterTransition, final Transition sharedElementTransition, + final Transition enterTransition, final TransitionSet sharedElementTransition, final Transition overallTransition, final View container, final Fragment inFragment, final Fragment outFragment, final ArrayList<View> hiddenFragmentViews, final boolean isBack, @@ -1094,11 +1100,8 @@ final class BackStackRecord extends FragmentTransaction implements if (sharedElementTransition != null) { namedViews = mapSharedElementsIn(state, isBack, inFragment); removeTargets(sharedElementTransition, sharedElementTargets); - sharedElementTargets.clear(); - sharedElementTargets.add(state.nonExistentView); - sharedElementTargets.addAll(namedViews.values()); - - addTargets(sharedElementTransition, sharedElementTargets); + setSharedElementTargets(sharedElementTransition, + state.nonExistentView, namedViews, sharedElementTargets); setEpicenterIn(namedViews, state); @@ -1241,8 +1244,8 @@ final class BackStackRecord extends FragmentTransaction implements Fragment outFragment = firstOutFragments.get(containerId); Transition enterTransition = getEnterTransition(inFragment, isBack); - Transition sharedElementTransition = getSharedElementTransition(inFragment, outFragment, - isBack); + TransitionSet sharedElementTransition = + getSharedElementTransition(inFragment, outFragment, isBack); Transition exitTransition = getExitTransition(outFragment, isBack); if (enterTransition == null && sharedElementTransition == null && @@ -1256,9 +1259,8 @@ final class BackStackRecord extends FragmentTransaction implements ArrayList<View> sharedElementTargets = new ArrayList<View>(); if (sharedElementTransition != null) { namedViews = remapSharedElements(state, outFragment, isBack); - sharedElementTargets.add(state.nonExistentView); - sharedElementTargets.addAll(namedViews.values()); - addTargets(sharedElementTransition, sharedElementTargets); + setSharedElementTargets(sharedElementTransition, + state.nonExistentView, namedViews, sharedElementTargets); // Notify the start of the transition. SharedElementCallback callback = isBack ? @@ -1294,8 +1296,8 @@ final class BackStackRecord extends FragmentTransaction implements if (transition != null) { ArrayList<View> hiddenFragments = new ArrayList<View>(); ArrayList<View> enteringViews = addTransitionTargets(state, enterTransition, - sharedElementTransition, transition, sceneRoot, inFragment, outFragment, - hiddenFragments, isBack, sharedElementTargets); + sharedElementTransition, transition, sceneRoot, inFragment, + outFragment, hiddenFragments, isBack, sharedElementTargets); transition.setNameOverrides(state.nameOverrides); // We want to exclude hidden views later, so we need a non-null list in the @@ -1307,9 +1309,71 @@ final class BackStackRecord extends FragmentTransaction implements // Remove the view targeting after the transition starts removeTargetedViewsFromTransitions(sceneRoot, state.nonExistentView, enterTransition, enteringViews, exitTransition, exitingViews, - sharedElementTransition, sharedElementTargets, transition, hiddenFragments); + sharedElementTransition, sharedElementTargets, transition, + hiddenFragments); + } + } + } + + /** + * Finds all children of the shared elements and sets the wrapping TransitionSet + * targets to point to those. It also limits transitions that have no targets to the + * specific shared elements. This allows developers to target child views of the + * shared elements specifically, but this doesn't happen by default. + */ + private static void setSharedElementTargets(TransitionSet transition, + View nonExistentView, ArrayMap<String, View> namedViews, + ArrayList<View> sharedElementTargets) { + sharedElementTargets.clear(); + sharedElementTargets.addAll(namedViews.values()); + + final List<View> views = transition.getTargets(); + views.clear(); + final int count = sharedElementTargets.size(); + for (int i = 0; i < count; i++) { + final View view = sharedElementTargets.get(i); + bfsAddViewChildren(views, view); + } + sharedElementTargets.add(nonExistentView); + addTargets(transition, sharedElementTargets); + } + + /** + * Uses a breadth-first scheme to add startView and all of its children to views. + * It won't add a child if it is already in views. + */ + private static void bfsAddViewChildren(final List<View> views, final View startView) { + final int startIndex = views.size(); + if (containedBeforeIndex(views, startView, startIndex)) { + return; // This child is already in the list, so all its children are also. + } + views.add(startView); + for (int index = startIndex; index < views.size(); index++) { + final View view = views.get(index); + if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + final int childCount = viewGroup.getChildCount(); + for (int childIndex = 0; childIndex < childCount; childIndex++) { + final View child = viewGroup.getChildAt(childIndex); + if (!containedBeforeIndex(views, child, startIndex)) { + views.add(child); + } + } + } + } + } + + /** + * Does a linear search through views for view, limited to maxIndex. + */ + private static boolean containedBeforeIndex(final List<View> views, final View view, + final int maxIndex) { + for (int i = 0; i < maxIndex; i++) { + if (views.get(i) == view) { + return true; } } + return false; } /** diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java new file mode 100644 index 0000000..1f378da --- /dev/null +++ b/core/java/android/app/BroadcastOptions.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2015 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.app; + +import android.annotation.SystemApi; +import android.os.Bundle; + +/** + * Helper class for building an options Bundle that can be used with + * {@link android.content.Context#sendBroadcast(android.content.Intent) + * Context.sendBroadcast(Intent)} and related methods. + * {@hide} + */ +@SystemApi +public class BroadcastOptions { + private long mTemporaryAppWhitelistDuration; + + /** + * How long to temporarily put an app on the power whitelist when executing this broadcast + * to it. + * @hide + */ + public static final String KEY_TEMPORARY_APP_WHITELIST_DURATION + = "android:broadcast.temporaryAppWhitelistDuration"; + + public static BroadcastOptions makeBasic() { + BroadcastOptions opts = new BroadcastOptions(); + return opts; + } + + private BroadcastOptions() { + } + + /** @hide */ + public BroadcastOptions(Bundle opts) { + mTemporaryAppWhitelistDuration = opts.getLong(KEY_TEMPORARY_APP_WHITELIST_DURATION); + } + + /** + * Set a duration for which the system should temporary place an application on the + * power whitelist when this broadcast is being delivered to it. + * @param duration The duration in milliseconds; 0 means to not place on whitelist. + */ + public void setTemporaryAppWhitelistDuration(long duration) { + mTemporaryAppWhitelistDuration = duration; + } + + /** + * Return {@link #setTemporaryAppWhitelistDuration}. + * @hide + */ + public long getTemporaryAppWhitelistDuration() { + return mTemporaryAppWhitelistDuration; + } + + /** + * Returns the created options as a Bundle, which can be passed to + * {@link android.content.Context#sendBroadcast(android.content.Intent) + * Context.sendBroadcast(Intent)} and related methods. + * Note that the returned Bundle is still owned by the ActivityOptions + * object; you must not modify it, but can supply it to the sendBroadcast + * methods that take an options Bundle. + */ + public Bundle toBundle() { + Bundle b = new Bundle(); + if (mTemporaryAppWhitelistDuration > 0) { + b.putLong(KEY_TEMPORARY_APP_WHITELIST_DURATION, mTemporaryAppWhitelistDuration); + } + return b.isEmpty() ? null : b; + } +} diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index be36af7..0420fb6 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -46,7 +46,6 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.hardware.display.DisplayManager; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -676,8 +675,8 @@ class ContextImpl extends Context { + " Is this really what you want?"); } mMainThread.getInstrumentation().execStartActivity( - getOuterContext(), mMainThread.getApplicationThread(), null, - (Activity)null, intent, -1, options); + getOuterContext(), mMainThread.getApplicationThread(), null, + (Activity) null, intent, -1, options); } /** @hide */ @@ -710,8 +709,8 @@ class ContextImpl extends Context { + " Is this really what you want?"); } mMainThread.getInstrumentation().execStartActivitiesAsUser( - getOuterContext(), mMainThread.getApplicationThread(), null, - (Activity)null, intents, options, userHandle.getIdentifier()); + getOuterContext(), mMainThread.getApplicationThread(), null, + (Activity) null, intents, options, userHandle.getIdentifier()); } @Override @@ -724,8 +723,8 @@ class ContextImpl extends Context { + " Is this really what you want?"); } mMainThread.getInstrumentation().execStartActivities( - getOuterContext(), mMainThread.getApplicationThread(), null, - (Activity)null, intents, options); + getOuterContext(), mMainThread.getApplicationThread(), null, + (Activity) null, intents, options); } @Override @@ -766,9 +765,9 @@ class ContextImpl extends Context { try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false, - getUserId()); + mMainThread.getApplicationThread(), intent, resolvedType, null, + Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, false, + getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -781,9 +780,24 @@ class ContextImpl extends Context { try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, - false, false, getUserId()); + mMainThread.getApplicationThread(), intent, resolvedType, null, + Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, + null, false, false, getUserId()); + } catch (RemoteException e) { + throw new RuntimeException("Failure from system", e); + } + } + + @Override + public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { + warnIfCallingFromSystemProcess(); + String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); + try { + intent.prepareToLeaveProcess(); + ActivityManagerNative.getDefault().broadcastIntent( + mMainThread.getApplicationThread(), intent, resolvedType, null, + Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, + options, false, false, getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -796,25 +810,24 @@ class ContextImpl extends Context { try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false, - getUserId()); + mMainThread.getApplicationThread(), intent, resolvedType, null, + Activity.RESULT_OK, null, null, receiverPermission, appOp, null, false, false, + getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } } @Override - public void sendOrderedBroadcast(Intent intent, - String receiverPermission) { + public void sendOrderedBroadcast(Intent intent, String receiverPermission) { warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false, - getUserId()); + mMainThread.getApplicationThread(), intent, resolvedType, null, + Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, + null, true, false, getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -826,7 +839,16 @@ class ContextImpl extends Context { Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE, - resultReceiver, scheduler, initialCode, initialData, initialExtras); + resultReceiver, scheduler, initialCode, initialData, initialExtras, null); + } + + @Override + public void sendOrderedBroadcast(Intent intent, + String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, + Handler scheduler, int initialCode, String initialData, + Bundle initialExtras) { + sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE, + resultReceiver, scheduler, initialCode, initialData, initialExtras, options); } @Override @@ -834,6 +856,14 @@ class ContextImpl extends Context { String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + sendOrderedBroadcast(intent, receiverPermission, appOp, + resultReceiver, scheduler, initialCode, initialData, initialExtras, null); + } + + void sendOrderedBroadcast(Intent intent, + String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + Handler scheduler, int initialCode, String initialData, + Bundle initialExtras, Bundle options) { warnIfCallingFromSystemProcess(); IIntentReceiver rd = null; if (resultReceiver != null) { @@ -858,7 +888,7 @@ class ContextImpl extends Context { ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, rd, initialCode, initialData, initialExtras, receiverPermission, appOp, - true, false, getUserId()); + options, true, false, getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -871,7 +901,7 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(), intent, resolvedType, null, Activity.RESULT_OK, null, null, null, - AppOpsManager.OP_NONE, false, false, user.getIdentifier()); + AppOpsManager.OP_NONE, null, false, false, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -891,7 +921,7 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false, + Activity.RESULT_OK, null, null, receiverPermission, appOp, null, false, false, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); @@ -934,7 +964,7 @@ class ContextImpl extends Context { ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, rd, initialCode, initialData, initialExtras, receiverPermission, - appOp, true, false, user.getIdentifier()); + appOp, null, true, false, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -949,7 +979,7 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, + Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); @@ -986,7 +1016,7 @@ class ContextImpl extends Context { ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, rd, initialCode, initialData, initialExtras, null, - AppOpsManager.OP_NONE, true, true, getUserId()); + AppOpsManager.OP_NONE, null, true, true, getUserId()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -1017,7 +1047,7 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier()); + Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } @@ -1052,7 +1082,7 @@ class ContextImpl extends Context { ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, rd, initialCode, initialData, initialExtras, null, - AppOpsManager.OP_NONE, true, true, user.getIdentifier()); + AppOpsManager.OP_NONE, null, true, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 9311e5e..e7f7e13 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -107,7 +107,7 @@ public interface IActivityManager extends IInterface { public int broadcastIntent(IApplicationThread caller, Intent intent, String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData, Bundle map, String requiredPermission, - int appOp, boolean serialized, boolean sticky, int userId) throws RemoteException; + int appOp, Bundle options, boolean serialized, boolean sticky, int userId) throws RemoteException; public void unbroadcastIntent(IApplicationThread caller, Intent intent, int userId) throws RemoteException; public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast, int flags) throws RemoteException; diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index 031854a..c42ba65 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -613,7 +613,7 @@ public final class PendingIntent implements Parcelable { * is no longer allowing more intents to be sent through it. */ public void send() throws CanceledException { - send(null, 0, null, null, null, null); + send(null, 0, null, null, null, null, null); } /** @@ -627,7 +627,7 @@ public final class PendingIntent implements Parcelable { * is no longer allowing more intents to be sent through it. */ public void send(int code) throws CanceledException { - send(null, code, null, null, null, null); + send(null, code, null, null, null, null, null); } /** @@ -646,9 +646,9 @@ public final class PendingIntent implements Parcelable { * @throws CanceledException Throws CanceledException if the PendingIntent * is no longer allowing more intents to be sent through it. */ - public void send(Context context, int code, Intent intent) + public void send(Context context, int code, @Nullable Intent intent) throws CanceledException { - send(context, code, intent, null, null, null); + send(context, code, intent, null, null, null, null); } /** @@ -667,9 +667,9 @@ public final class PendingIntent implements Parcelable { * @throws CanceledException Throws CanceledException if the PendingIntent * is no longer allowing more intents to be sent through it. */ - public void send(int code, OnFinished onFinished, Handler handler) + public void send(int code, @Nullable OnFinished onFinished, @Nullable Handler handler) throws CanceledException { - send(null, code, null, onFinished, handler, null); + send(null, code, null, onFinished, handler, null, null); } /** @@ -705,9 +705,9 @@ public final class PendingIntent implements Parcelable { * @throws CanceledException Throws CanceledException if the PendingIntent * is no longer allowing more intents to be sent through it. */ - public void send(Context context, int code, Intent intent, - OnFinished onFinished, Handler handler) throws CanceledException { - send(context, code, intent, onFinished, handler, null); + public void send(Context context, int code, @Nullable Intent intent, + @Nullable OnFinished onFinished, @Nullable Handler handler) throws CanceledException { + send(context, code, intent, onFinished, handler, null, null); } /** @@ -748,8 +748,56 @@ public final class PendingIntent implements Parcelable { * @throws CanceledException Throws CanceledException if the PendingIntent * is no longer allowing more intents to be sent through it. */ - public void send(Context context, int code, Intent intent, - OnFinished onFinished, Handler handler, String requiredPermission) + public void send(Context context, int code, @Nullable Intent intent, + @Nullable OnFinished onFinished, @Nullable Handler handler, + @Nullable String requiredPermission) + throws CanceledException { + send(context, code, intent, onFinished, handler, requiredPermission, null); + } + + /** + * Perform the operation associated with this PendingIntent, allowing the + * caller to specify information about the Intent to use and be notified + * when the send has completed. + * + * <p>For the intent parameter, a PendingIntent + * often has restrictions on which fields can be supplied here, based on + * how the PendingIntent was retrieved in {@link #getActivity}, + * {@link #getBroadcast}, or {@link #getService}. + * + * @param context The Context of the caller. This may be null if + * <var>intent</var> is also null. + * @param code Result code to supply back to the PendingIntent's target. + * @param intent Additional Intent data. See {@link Intent#fillIn + * Intent.fillIn()} for information on how this is applied to the + * original Intent. Use null to not modify the original Intent. + * If flag {@link #FLAG_IMMUTABLE} was set when this pending intent was + * created, this argument will be ignored. + * @param onFinished The object to call back on when the send has + * completed, or null for no callback. + * @param handler Handler identifying the thread on which the callback + * should happen. If null, the callback will happen from the thread + * pool of the process. + * @param requiredPermission Name of permission that a recipient of the PendingIntent + * is required to hold. This is only valid for broadcast intents, and + * corresponds to the permission argument in + * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. + * If null, no permission is required. + * @param options Additional options the caller would like to provide to modify the sending + * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. + * + * @see #send() + * @see #send(int) + * @see #send(Context, int, Intent) + * @see #send(int, android.app.PendingIntent.OnFinished, Handler) + * @see #send(Context, int, Intent, OnFinished, Handler) + * + * @throws CanceledException Throws CanceledException if the PendingIntent + * is no longer allowing more intents to be sent through it. + */ + public void send(Context context, int code, @Nullable Intent intent, + @Nullable OnFinished onFinished, @Nullable Handler handler, + @Nullable String requiredPermission, @Nullable Bundle options) throws CanceledException { try { String resolvedType = intent != null ? @@ -759,7 +807,7 @@ public final class PendingIntent implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission); + requiredPermission, options); if (res < 0) { throw new CanceledException(); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 9f49154..ed20086 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -403,8 +403,9 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER"; /** - * A String extra holding the URL-safe base64 encoded SHA-1 checksum of the file at download - * location specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. + * A String extra holding the URL-safe base64 encoded SHA-256 or SHA-1 hash (see notes below) of + * the file at download location specified in + * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. * * <p>Either this extra or {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM} should be * present. The provided checksum should match the checksum of the file at the download @@ -413,12 +414,17 @@ public class DevicePolicyManager { * * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner * provisioning via an NFC bump. + * + * <p><strong>Note:</strong> for devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} + * and {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} only SHA-1 hash is supported. + * Starting from {@link android.os.Build.VERSION_CODES#MNC}, this parameter accepts SHA-256 in + * addition to SHA-1. Support for SHA-1 is likely to be removed in future OS releases. */ public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM"; /** - * A String extra holding the URL-safe base64 encoded SHA-1 checksum of any signature of the + * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the * android package archive at the download location specified in {@link * #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. * @@ -510,7 +516,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; /** - * A String extra holding the URL-safe base64 encoded SHA-1 checksum of the file at download + * A String extra holding the URL-safe base64 encoded SHA-256 checksum of the file at download * location specified in * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. * @@ -526,7 +532,7 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; /** - * A String extra holding the URL-safe base64 encoded SHA-1 checksum of any signature of the + * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the * android package archive at the download location specified in {@link * #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. * @@ -924,7 +930,7 @@ public class DevicePolicyManager { /** * Constant for {@link #setPasswordQuality}: the policy requires some kind - * of password, but doesn't care what it is. Note that quality constants + * of password or pattern, but doesn't care what it is. Note that quality constants * are ordered so that higher values are more restrictive. */ public static final int PASSWORD_QUALITY_SOMETHING = 0x10000; diff --git a/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java b/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java index 161c339..834a587 100644 --- a/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java +++ b/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java @@ -28,10 +28,10 @@ import android.os.Parcelable; public final class BluetoothActivityEnergyInfo implements Parcelable { private final long mTimestamp; private final int mBluetoothStackState; - private final int mControllerTxTimeMs; - private final int mControllerRxTimeMs; - private final int mControllerIdleTimeMs; - private final int mControllerEnergyUsed; + private final long mControllerTxTimeMs; + private final long mControllerRxTimeMs; + private final long mControllerIdleTimeMs; + private final long mControllerEnergyUsed; public static final int BT_STACK_STATE_INVALID = 0; public static final int BT_STACK_STATE_STATE_ACTIVE = 1; @@ -39,7 +39,7 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { public static final int BT_STACK_STATE_STATE_IDLE = 3; public BluetoothActivityEnergyInfo(long timestamp, int stackState, - int txTime, int rxTime, int idleTime, int energyUsed) { + long txTime, long rxTime, long idleTime, long energyUsed) { mTimestamp = timestamp; mBluetoothStackState = stackState; mControllerTxTimeMs = txTime; @@ -65,10 +65,10 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { public BluetoothActivityEnergyInfo createFromParcel(Parcel in) { long timestamp = in.readLong(); int stackState = in.readInt(); - int txTime = in.readInt(); - int rxTime = in.readInt(); - int idleTime = in.readInt(); - int energyUsed = in.readInt(); + long txTime = in.readLong(); + long rxTime = in.readLong(); + long idleTime = in.readLong(); + long energyUsed = in.readLong(); return new BluetoothActivityEnergyInfo(timestamp, stackState, txTime, rxTime, idleTime, energyUsed); } @@ -80,10 +80,10 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeLong(mTimestamp); out.writeInt(mBluetoothStackState); - out.writeInt(mControllerTxTimeMs); - out.writeInt(mControllerRxTimeMs); - out.writeInt(mControllerIdleTimeMs); - out.writeInt(mControllerEnergyUsed); + out.writeLong(mControllerTxTimeMs); + out.writeLong(mControllerRxTimeMs); + out.writeLong(mControllerIdleTimeMs); + out.writeLong(mControllerEnergyUsed); } public int describeContents() { @@ -100,21 +100,21 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { /** * @return tx time in ms */ - public int getControllerTxTimeMillis() { + public long getControllerTxTimeMillis() { return mControllerTxTimeMs; } /** * @return rx time in ms */ - public int getControllerRxTimeMillis() { + public long getControllerRxTimeMillis() { return mControllerRxTimeMs; } /** * @return idle time in ms */ - public int getControllerIdleTimeMillis() { + public long getControllerIdleTimeMillis() { return mControllerIdleTimeMs; } @@ -122,7 +122,7 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { * product of current(mA), voltage(V) and time(ms) * @return energy used */ - public int getControllerEnergyUsed() { + public long getControllerEnergyUsed() { return mControllerEnergyUsed; } @@ -137,8 +137,8 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { * @return if the record is valid */ public boolean isValid() { - return ((getControllerTxTimeMillis() !=0) || - (getControllerRxTimeMillis() !=0) || - (getControllerIdleTimeMillis() !=0)); + return ((mControllerTxTimeMs !=0) || + (mControllerRxTimeMs !=0) || + (mControllerIdleTimeMs !=0)); } } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 970623a..675515b 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1517,6 +1517,38 @@ public abstract class Context { @Nullable String receiverPermission); /** + * Broadcast the given intent to all interested BroadcastReceivers, allowing + * an optional required permission to be enforced. This + * call is asynchronous; it returns immediately, and you will continue + * executing while the receivers are run. No results are propagated from + * receivers and receivers can not abort the broadcast. If you want + * to allow receivers to propagate results or abort the broadcast, you must + * send an ordered broadcast using + * {@link #sendOrderedBroadcast(Intent, String)}. + * + * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts. + * + * @param intent The Intent to broadcast; all receivers matching this + * Intent will receive the broadcast. + * @param receiverPermission (optional) String naming a permission that + * a receiver must hold in order to receive your broadcast. + * If null, no permission is required. + * @param options (optional) Additional sending options, generated from a + * {@link android.app.BroadcastOptions}. + * + * @see android.content.BroadcastReceiver + * @see #registerReceiver + * @see #sendBroadcast(Intent) + * @see #sendOrderedBroadcast(Intent, String) + * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle) + * @hide + */ + @SystemApi + public abstract void sendBroadcast(Intent intent, + @Nullable String receiverPermission, + @Nullable Bundle options); + + /** * Like {@link #sendBroadcast(Intent, String)}, but also allows specification * of an associated app op as per {@link android.app.AppOpsManager}. * @hide @@ -1588,11 +1620,60 @@ public abstract class Context { * @see android.app.Activity#RESULT_OK */ public abstract void sendOrderedBroadcast(@NonNull Intent intent, - @Nullable String receiverPermission, BroadcastReceiver resultReceiver, + @Nullable String receiverPermission, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras); /** + * Version of {@link #sendBroadcast(Intent)} that allows you to + * receive data back from the broadcast. This is accomplished by + * supplying your own BroadcastReceiver when calling, which will be + * treated as a final receiver at the end of the broadcast -- its + * {@link BroadcastReceiver#onReceive} method will be called with + * the result values collected from the other receivers. The broadcast will + * be serialized in the same way as calling + * {@link #sendOrderedBroadcast(Intent, String)}. + * + * <p>Like {@link #sendBroadcast(Intent)}, this method is + * asynchronous; it will return before + * resultReceiver.onReceive() is called. + * + * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts. + * + * + * @param intent The Intent to broadcast; all receivers matching this + * Intent will receive the broadcast. + * @param receiverPermission String naming a permissions that + * a receiver must hold in order to receive your broadcast. + * If null, no permission is required. + * @param options (optional) Additional sending options, generated from a + * {@link android.app.BroadcastOptions}. + * @param resultReceiver Your own BroadcastReceiver to treat as the final + * receiver of the broadcast. + * @param scheduler A custom Handler with which to schedule the + * resultReceiver callback; if null it will be + * scheduled in the Context's main thread. + * @param initialCode An initial value for the result code. Often + * Activity.RESULT_OK. + * @param initialData An initial value for the result data. Often + * null. + * @param initialExtras An initial value for the result extras. Often + * null. + * @see #sendBroadcast(Intent) + * @see #sendBroadcast(Intent, String) + * @see #sendOrderedBroadcast(Intent, String) + * @see android.content.BroadcastReceiver + * @see #registerReceiver + * @see android.app.Activity#RESULT_OK + * @hide + */ + @SystemApi + public abstract void sendOrderedBroadcast(@NonNull Intent intent, + @Nullable String receiverPermission, @Nullable Bundle options, + @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, + int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras); + + /** * Like {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, * int, String, android.os.Bundle)}, but also allows specification * of an associated app op as per {@link android.app.AppOpsManager}. @@ -2248,6 +2329,7 @@ public abstract class Context { //@hide: VOICE_INTERACTION_MANAGER_SERVICE, //@hide: BACKUP_SERVICE, DROPBOX_SERVICE, + //@hide: DEVICE_IDLE_CONTROLLER, DEVICE_POLICY_SERVICE, UI_MODE_SERVICE, DOWNLOAD_SERVICE, @@ -2874,6 +2956,13 @@ public abstract class Context { public static final String DROPBOX_SERVICE = "dropbox"; /** + * System service name for the DeviceIdleController. There is no Java API for this. + * @see #getSystemService + * @hide + */ + public static final String DEVICE_IDLE_CONTROLLER = "deviceidle"; + + /** * Use with {@link #getSystemService} to retrieve a * {@link android.app.admin.DevicePolicyManager} for working with global * device policy management. diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index fb9e194..4e7c832 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -16,6 +16,7 @@ package android.content; +import android.annotation.SystemApi; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.AssetManager; @@ -401,6 +402,13 @@ public class ContextWrapper extends Context { } /** @hide */ + @SystemApi + @Override + public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { + mBase.sendBroadcast(intent, receiverPermission, options); + } + + /** @hide */ @Override public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { mBase.sendBroadcast(intent, receiverPermission, appOp); @@ -423,6 +431,18 @@ public class ContextWrapper extends Context { } /** @hide */ + @SystemApi + @Override + public void sendOrderedBroadcast( + Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, + Handler scheduler, int initialCode, String initialData, + Bundle initialExtras) { + mBase.sendOrderedBroadcast(intent, receiverPermission, + options, resultReceiver, scheduler, initialCode, + initialData, initialExtras); + } + + /** @hide */ @Override public void sendOrderedBroadcast( Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, diff --git a/core/java/android/content/IIntentSender.aidl b/core/java/android/content/IIntentSender.aidl index 7dbd6f2..f3affa7 100644 --- a/core/java/android/content/IIntentSender.aidl +++ b/core/java/android/content/IIntentSender.aidl @@ -18,9 +18,10 @@ package android.content; import android.content.IIntentReceiver; import android.content.Intent; +import android.os.Bundle; /** @hide */ interface IIntentSender { int send(int code, in Intent intent, String resolvedType, - IIntentReceiver finishedReceiver, String requiredPermission); + IIntentReceiver finishedReceiver, String requiredPermission, in Bundle options); } diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index 166495b..13a767e 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -195,7 +195,7 @@ public class IntentSender implements Parcelable { onFinished != null ? new FinishedDispatcher(this, onFinished, handler) : null, - requiredPermission); + requiredPermission, null); if (res < 0) { throw new SendIntentException(); } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index c92c256..287e0c5 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -4024,7 +4024,7 @@ public class PackageParser { public static final PublicKey parsePublicKey(final String encodedPublicKey) { if (encodedPublicKey == null) { - Slog.i(TAG, "Could not parse null public key"); + Slog.w(TAG, "Could not parse null public key"); return null; } @@ -4033,7 +4033,7 @@ public class PackageParser { final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT); keySpec = new X509EncodedKeySpec(encoded); } catch (IllegalArgumentException e) { - Slog.i(TAG, "Could not parse verifier public key; invalid Base64"); + Slog.w(TAG, "Could not parse verifier public key; invalid Base64"); return null; } @@ -4042,23 +4042,32 @@ public class PackageParser { final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(keySpec); } catch (NoSuchAlgorithmException e) { - Log.wtf(TAG, "Could not parse public key because RSA isn't included in build"); - return null; + Slog.wtf(TAG, "Could not parse public key: RSA KeyFactory not included in build"); } catch (InvalidKeySpecException e) { // Not a RSA public key. } + /* Now try it as a ECDSA key. */ + try { + final KeyFactory keyFactory = KeyFactory.getInstance("EC"); + return keyFactory.generatePublic(keySpec); + } catch (NoSuchAlgorithmException e) { + Slog.wtf(TAG, "Could not parse public key: EC KeyFactory not included in build"); + } catch (InvalidKeySpecException e) { + // Not a ECDSA public key. + } + /* Now try it as a DSA key. */ try { final KeyFactory keyFactory = KeyFactory.getInstance("DSA"); return keyFactory.generatePublic(keySpec); } catch (NoSuchAlgorithmException e) { - Log.wtf(TAG, "Could not parse public key because DSA isn't included in build"); - return null; + Slog.wtf(TAG, "Could not parse public key: DSA KeyFactory not included in build"); } catch (InvalidKeySpecException e) { // Not a DSA public key. } + /* Not a supported key type */ return null; } diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index b69ca88..27d14b3 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -1093,14 +1093,28 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>so <code>[x_s, y_s]</code> is the pixel coordinates of the world * point, <code>z_s = 1</code>, and <code>w_s</code> is a measurement of disparity * (depth) in pixel coordinates.</p> + * <p>Note that the coordinate system for this transform is the + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} system, + * where <code>(0,0)</code> is the top-left of the + * preCorrectionActiveArraySize rectangle. Once the pose and + * intrinsic calibration transforms have been applied to a + * world point, then the android.lens.radialDistortion + * transform needs to be applied, and the result adjusted to + * be in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate + * system (where <code>(0, 0)</code> is the top-left of the + * activeArraySize rectangle), to determine the final pixel + * coordinate of the world point for processed (non-RAW) + * output buffers.</p> * <p><b>Units</b>: - * Pixels in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate - * system.</p> + * Pixels in the + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} + * coordinate system.</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> * * @see CameraCharacteristics#LENS_POSE_ROTATION * @see CameraCharacteristics#LENS_POSE_TRANSLATION * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey public static final Key<float[]> LENS_INTRINSIC_CALIBRATION = @@ -1109,13 +1123,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>The correction coefficients to correct for this camera device's * radial and tangential lens distortion.</p> - * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2, + * <p>Four radial distortion coefficients <code>[kappa_0, kappa_1, kappa_2, * kappa_3]</code> and two tangential distortion coefficients * <code>[kappa_4, kappa_5]</code> that can be used to correct the * lens's geometric distortion with the mapping equations:</p> - * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + + * <pre><code> x_c = x_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + * kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 ) - * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + + * y_c = y_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + * kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 ) * </code></pre> * <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the @@ -1959,22 +1973,25 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri new Key<Integer>("android.scaler.croppingType", int.class); /** - * <p>The area of the image sensor which corresponds to - * active pixels.</p> - * <p>This is the region of the sensor that actually receives light from the scene. - * Therefore, the size of this region determines the maximum field of view and the maximum - * number of pixels that an image from this sensor can contain.</p> - * <p>The rectangle is defined in terms of the full pixel array; (0,0) is the top-left of the - * full pixel array, and the size of the full pixel array is given by + * <p>The area of the image sensor which corresponds to active pixels after any geometric + * distortion correction has been applied.</p> + * <p>This is the rectangle representing the size of the active region of the sensor (i.e. + * the region that actually receives light from the scene) after any geometric correction + * has been applied, and should be treated as the maximum size in pixels of any of the + * image output formats aside from the raw formats.</p> + * <p>This rectangle is defined relative to the full pixel array; (0,0) is the top-left of + * the full pixel array, and the size of the full pixel array is given by * {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}.</p> - * <p>Most other keys listing pixel coordinates have their coordinate systems based on the - * active array, with <code>(0, 0)</code> being the top-left of the active array rectangle.</p> + * <p>The coordinate system for most other keys that list pixel coordinates, including + * {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion}, is defined relative to the active array rectangle given in + * this field, with <code>(0, 0)</code> being the top-left of this rectangle.</p> * <p>The active array may be smaller than the full pixel array, since the full array may - * include black calibration pixels or other inactive regions.</p> + * include black calibration pixels or other inactive regions, and geometric correction + * resulting in scaling or cropping may have been applied.</p> * <p><b>Units</b>: Pixel coordinates on the image sensor</p> - * <p><b>Range of valid values:</b><br></p> * <p>This key is available on all devices.</p> * + * @see CaptureRequest#SCALER_CROP_REGION * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE */ @PublicKey @@ -1982,6 +1999,70 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri new Key<android.graphics.Rect>("android.sensor.info.activeArraySize", android.graphics.Rect.class); /** + * <p>The area of the image sensor which corresponds to active pixels prior to the + * application of any geometric distortion correction.</p> + * <p>This is the rectangle representing the size of the active region of the sensor (i.e. + * the region that actually receives light from the scene) before any geometric correction + * has been applied, and should be treated as the active region rectangle for any of the + * raw formats. All metadata associated with raw processing (e.g. the lens shading + * correction map, and radial distortion fields) treats the top, left of this rectangle as + * the origin, (0,0).</p> + * <p>The size of this region determines the maximum field of view and the maximum number of + * pixels that an image from this sensor can contain, prior to the application of + * geometric distortion correction. The effective maximum pixel dimensions of a + * post-distortion-corrected image is given by the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} + * field, and the effective maximum field of view for a post-distortion-corrected image + * can be calculated by applying the geometric distortion correction fields to this + * rectangle, and cropping to the rectangle given in {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p> + * <p>E.g. to calculate position of a pixel, (x,y), in a processed YUV output image with the + * dimensions in {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} given the position of a pixel, + * (x', y'), in the raw pixel array with dimensions give in + * {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}:</p> + * <ol> + * <li>Choose a pixel (x', y') within the active array region of the raw buffer given in + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, otherwise this pixel is considered + * to be outside of the FOV, and will not be shown in the processed output image.</li> + * <li>Apply geometric distortion correction to get the post-distortion pixel coordinate, + * (x_i, y_i). When applying geometric correction metadata, note that metadata for raw + * buffers is defined relative to the top, left of the + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} rectangle.</li> + * <li>If the resulting corrected pixel coordinate is within the region given in + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, then the position of this pixel in the + * processed output image buffer is <code>(x_i - activeArray.left, y_i - activeArray.top)</code>, + * when the top, left coordinate of that buffer is treated as (0, 0).</li> + * </ol> + * <p>Thus, for pixel x',y' = (25, 25) on a sensor where {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize} + * is (100,100), {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} is (10, 10, 100, 100), + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} is (20, 20, 80, 80), and the geometric distortion + * correction doesn't change the pixel coordinate, the resulting pixel selected in + * pixel coordinates would be x,y = (25, 25) relative to the top,left of the raw buffer + * with dimensions given in {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}, and would be (5, 5) + * relative to the top,left of post-processed YUV output buffer with dimensions given in + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p> + * <p>The currently supported fields that correct for geometric distortion are:</p> + * <ol> + * <li>android.lens.radialDistortion.</li> + * </ol> + * <p>If all of the geometric distortion fields are no-ops, this rectangle will be the same + * as the post-distortion-corrected rectangle given in + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p> + * <p>This rectangle is defined relative to the full pixel array; (0,0) is the top-left of + * the full pixel array, and the size of the full pixel array is given by + * {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}.</p> + * <p>The pre-correction active array may be smaller than the full pixel array, since the + * full array may include black calibration pixels or other inactive regions.</p> + * <p><b>Units</b>: Pixel coordinates on the image sensor</p> + * <p>This key is available on all devices.</p> + * + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE + */ + @PublicKey + public static final Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE = + new Key<android.graphics.Rect>("android.sensor.info.preCorrectionActiveArraySize", android.graphics.Rect.class); + + /** * <p>Range of sensitivities for {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity} supported by this * camera device.</p> * <p>The values are the standard ISO sensitivity values, @@ -2089,22 +2170,24 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>Dimensions of the full pixel array, possibly * including black calibration pixels.</p> - * <p>The pixel count of the full pixel array, - * which covers {@link CameraCharacteristics#SENSOR_INFO_PHYSICAL_SIZE android.sensor.info.physicalSize} area.</p> - * <p>If a camera device supports raw sensor formats, either this - * or {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} is the maximum output - * raw size listed in {@link CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP android.scaler.streamConfigurationMap}. - * If a size corresponding to pixelArraySize is listed, the resulting - * raw sensor image will include black pixels.</p> + * <p>The pixel count of the full pixel array of the image sensor, which covers + * {@link CameraCharacteristics#SENSOR_INFO_PHYSICAL_SIZE android.sensor.info.physicalSize} area. This represents the full pixel dimensions of + * the raw buffers produced by this sensor.</p> + * <p>If a camera device supports raw sensor formats, either this or + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} is the maximum dimensions for the raw + * output formats listed in {@link CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP android.scaler.streamConfigurationMap} (this depends on + * whether or not the image sensor returns buffers containing pixels that are not + * part of the active array region for blacklevel calibration or other purposes).</p> * <p>Some parts of the full pixel array may not receive light from the scene, - * or are otherwise inactive. The {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} key - * defines the rectangle of active pixels that actually forms an image.</p> + * or be otherwise inactive. The {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} key + * defines the rectangle of active pixels that will be included in processed image + * formats.</p> * <p><b>Units</b>: Pixels</p> * <p>This key is available on all devices.</p> * * @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CameraCharacteristics#SENSOR_INFO_PHYSICAL_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey public static final Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE = diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 3bb2fdb..da216aa 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -2655,14 +2655,28 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>so <code>[x_s, y_s]</code> is the pixel coordinates of the world * point, <code>z_s = 1</code>, and <code>w_s</code> is a measurement of disparity * (depth) in pixel coordinates.</p> + * <p>Note that the coordinate system for this transform is the + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} system, + * where <code>(0,0)</code> is the top-left of the + * preCorrectionActiveArraySize rectangle. Once the pose and + * intrinsic calibration transforms have been applied to a + * world point, then the android.lens.radialDistortion + * transform needs to be applied, and the result adjusted to + * be in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate + * system (where <code>(0, 0)</code> is the top-left of the + * activeArraySize rectangle), to determine the final pixel + * coordinate of the world point for processed (non-RAW) + * output buffers.</p> * <p><b>Units</b>: - * Pixels in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate - * system.</p> + * Pixels in the + * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} + * coordinate system.</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> * * @see CameraCharacteristics#LENS_POSE_ROTATION * @see CameraCharacteristics#LENS_POSE_TRANSLATION * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey public static final Key<float[]> LENS_INTRINSIC_CALIBRATION = @@ -2671,13 +2685,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { /** * <p>The correction coefficients to correct for this camera device's * radial and tangential lens distortion.</p> - * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2, + * <p>Four radial distortion coefficients <code>[kappa_0, kappa_1, kappa_2, * kappa_3]</code> and two tangential distortion coefficients * <code>[kappa_4, kappa_5]</code> that can be used to correct the * lens's geometric distortion with the mapping equations:</p> - * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + + * <pre><code> x_c = x_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + * kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 ) - * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + + * y_c = y_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) + * kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 ) * </code></pre> * <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 8512b23..83128c3 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -537,12 +537,16 @@ public class CameraDeviceImpl extends CameraDevice { CameraAccessException pendingException = null; Surface input = null; try { - // configure streams and then block until IDLE + // configure streams and then block until IDLE configureSuccess = configureStreamsChecked(inputConfig, outputConfigurations, isConstrainedHighSpeed); - if (inputConfig != null) { + if (configureSuccess == true && inputConfig != null) { input = new Surface(); - mRemoteDevice.getInputSurface(/*out*/input); + try { + mRemoteDevice.getInputSurface(/*out*/input); + } catch (CameraRuntimeException e) { + e.asChecked(); + } } } catch (CameraAccessException e) { configureSuccess = false; @@ -2049,12 +2053,16 @@ public class CameraDeviceImpl extends CameraDevice { // Prepare the Request builders: need carry over the request controls. // First, create a request builder that will only include preview or recording target. CameraMetadataNative requestMetadata = new CameraMetadataNative(request.getNativeCopy()); + // Note that after this step, the requestMetadata is mutated (swapped) and can not be used + // for next request builder creation. CaptureRequest.Builder singleTargetRequestBuilder = new CaptureRequest.Builder( requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE); // Overwrite the capture intent to make sure a good value is set. - Surface[] surfaces = (Surface[])outputSurfaces.toArray(); - if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(surfaces[0])) { + Iterator<Surface> iterator = outputSurfaces.iterator(); + Surface firstSurface = iterator.next(); + Surface secondSurface = null; + if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(firstSurface)) { singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW); } else { @@ -2067,23 +2075,27 @@ public class CameraDeviceImpl extends CameraDevice { // Second, Create a request builder that will include both preview and recording targets. CaptureRequest.Builder doubleTargetRequestBuilder = null; if (outputSurfaces.size() == 2) { + // Have to create a new copy, the original one was mutated after a new + // CaptureRequest.Builder creation. + requestMetadata = new CameraMetadataNative(request.getNativeCopy()); doubleTargetRequestBuilder = new CaptureRequest.Builder( requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE); doubleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD); - doubleTargetRequestBuilder.addTarget(surfaces[0]); - doubleTargetRequestBuilder.addTarget(surfaces[1]); + doubleTargetRequestBuilder.addTarget(firstSurface); + secondSurface = iterator.next(); + doubleTargetRequestBuilder.addTarget(secondSurface); doubleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true); // Make sure singleTargetRequestBuilder contains only recording surface for // preview + recording case. - Surface recordingSurface = surfaces[0]; + Surface recordingSurface = firstSurface; if (!SurfaceUtils.isSurfaceForHwVideoEncoder(recordingSurface)) { - recordingSurface = surfaces[1]; + recordingSurface = secondSurface; } singleTargetRequestBuilder.addTarget(recordingSurface); } else { // Single output case: either recording or preview. - singleTargetRequestBuilder.addTarget(surfaces[0]); + singleTargetRequestBuilder.addTarget(firstSurface); } // Generate the final request list. diff --git a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java index d461bca..1aee794 100644 --- a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java +++ b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java @@ -138,8 +138,8 @@ public class CameraBinderDecorator { * errors, then add them to the top switch statement */ if (errorFlag < 0) { - throw new UnsupportedOperationException(String.format("Unknown error %d", - errorFlag)); + throw new CameraRuntimeException(CAMERA_ERROR, + String.format("Unknown camera device error %d", errorFlag)); } } diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 3a3c47d..a2ca41c 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -801,28 +801,6 @@ public class ConnectivityManager { } /** - * Returns details about the Provisioning or currently active default data network. When - * connected, this network is the default route for outgoing connections. - * You should always check {@link NetworkInfo#isConnected()} before initiating - * network traffic. This may return {@code null} when there is no default - * network. - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. - * - * @return a {@link NetworkInfo} object for the current default network - * or {@code null} if no default network is currently active - * - * {@hide} - */ - public NetworkInfo getProvisioningOrActiveNetworkInfo() { - try { - return mService.getProvisioningOrActiveNetworkInfo(); - } catch (RemoteException e) { - return null; - } - } - - /** * Returns the IP information for the current default network. * <p>This method requires the caller to hold the permission * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. @@ -2007,24 +1985,6 @@ public class ConnectivityManager { } /** - * Signal that the captive portal check on the indicated network - * is complete and whether its a captive portal or not. - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. - * - * @param info the {@link NetworkInfo} object for the networkType - * in question. - * @param isCaptivePortal true/false. - * {@hide} - */ - public void captivePortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) { - try { - mService.captivePortalCheckCompleted(info, isCaptivePortal); - } catch (RemoteException e) { - } - } - - /** * Check mobile provisioning. * * @param suggestedTimeOutMs, timeout in milliseconds @@ -2056,18 +2016,6 @@ public class ConnectivityManager { } /** - * Get the mobile redirected provisioning url. - * {@hide} - */ - public String getMobileRedirectedProvisioningUrl() { - try { - return mService.getMobileRedirectedProvisioningUrl(); - } catch (RemoteException e) { - } - return null; - } - - /** * Set sign in error notification to visible or in visible * * @param visible diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 89d23a2..29557bb 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -53,8 +53,6 @@ interface IConnectivityManager Network[] getAllNetworks(); NetworkCapabilities[] getDefaultNetworkCapabilitiesForUser(int userId); - NetworkInfo getProvisioningOrActiveNetworkInfo(); - boolean isNetworkSupported(int networkType); LinkProperties getActiveLinkProperties(); @@ -122,14 +120,10 @@ interface IConnectivityManager boolean updateLockdownVpn(); - void captivePortalCheckCompleted(in NetworkInfo info, boolean isCaptivePortal); - int checkMobileProvisioning(int suggestedTimeOutMs); String getMobileProvisioningUrl(); - String getMobileRedirectedProvisioningUrl(); - void setProvisioningNotificationVisible(boolean visible, int networkType, in String action); void setAirplaneMode(boolean enable); diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 9628bae..fe69320 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -378,6 +378,9 @@ public class Network implements Parcelable { // // The HANDLE_MAGIC value MUST be kept in sync with the corresponding // value in the native/android/net.c NDK implementation. + if (netId == 0) { + return 0L; // make this zero condition obvious for debugging + } final long HANDLE_MAGIC = 0xfacade; return (((long) netId) << 32) | HANDLE_MAGIC; } diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java index 393637e..af7a465 100644 --- a/core/java/android/net/NetworkInfo.java +++ b/core/java/android/net/NetworkInfo.java @@ -120,7 +120,6 @@ public class NetworkInfo implements Parcelable { private String mExtraInfo; private boolean mIsFailover; private boolean mIsRoaming; - private boolean mIsConnectedToProvisioningNetwork; /** * Indicates whether network connectivity is possible: @@ -142,7 +141,6 @@ public class NetworkInfo implements Parcelable { mState = State.UNKNOWN; mIsAvailable = false; // until we're told otherwise, assume unavailable mIsRoaming = false; - mIsConnectedToProvisioningNetwork = false; } /** {@hide} */ @@ -160,7 +158,6 @@ public class NetworkInfo implements Parcelable { mIsFailover = source.mIsFailover; mIsRoaming = source.mIsRoaming; mIsAvailable = source.mIsAvailable; - mIsConnectedToProvisioningNetwork = source.mIsConnectedToProvisioningNetwork; } } } @@ -332,22 +329,6 @@ public class NetworkInfo implements Parcelable { } } - /** {@hide} */ - @VisibleForTesting - public boolean isConnectedToProvisioningNetwork() { - synchronized (this) { - return mIsConnectedToProvisioningNetwork; - } - } - - /** {@hide} */ - @VisibleForTesting - public void setIsConnectedToProvisioningNetwork(boolean val) { - synchronized (this) { - mIsConnectedToProvisioningNetwork = val; - } - } - /** * Reports the current coarse-grained state of the network. * @return the coarse-grained state @@ -431,8 +412,6 @@ public class NetworkInfo implements Parcelable { append(", roaming: ").append(mIsRoaming). append(", failover: ").append(mIsFailover). append(", isAvailable: ").append(mIsAvailable). - append(", isConnectedToProvisioningNetwork: "). - append(mIsConnectedToProvisioningNetwork). append("]"); return builder.toString(); } @@ -461,7 +440,6 @@ public class NetworkInfo implements Parcelable { dest.writeInt(mIsFailover ? 1 : 0); dest.writeInt(mIsAvailable ? 1 : 0); dest.writeInt(mIsRoaming ? 1 : 0); - dest.writeInt(mIsConnectedToProvisioningNetwork ? 1 : 0); dest.writeString(mReason); dest.writeString(mExtraInfo); } @@ -484,7 +462,6 @@ public class NetworkInfo implements Parcelable { netInfo.mIsFailover = in.readInt() != 0; netInfo.mIsAvailable = in.readInt() != 0; netInfo.mIsRoaming = in.readInt() != 0; - netInfo.mIsConnectedToProvisioningNetwork = in.readInt() != 0; netInfo.mReason = in.readString(); netInfo.mExtraInfo = in.readString(); return netInfo; diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index ecc3fb4..3f40484 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -61,6 +61,17 @@ public class NetworkPolicyManager { public static final int FIREWALL_RULE_ALLOW = 1; public static final int FIREWALL_RULE_DENY = 2; + public static final int FIREWALL_TYPE_WHITELIST = 0; + public static final int FIREWALL_TYPE_BLACKLIST = 1; + + public static final int FIREWALL_CHAIN_NONE = 0; + public static final int FIREWALL_CHAIN_DOZABLE = 1; + public static final int FIREWALL_CHAIN_STANDBY = 2; + + public static final String FIREWALL_CHAIN_NAME_NONE = "none"; + public static final String FIREWALL_CHAIN_NAME_DOZABLE = "dozable"; + public static final String FIREWALL_CHAIN_NAME_STANDBY = "standby"; + private static final boolean ALLOW_PLATFORM_APP_POLICY = true; /** diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index ff3de2b..bb08be2 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -53,6 +53,8 @@ public class TrafficStats { public static final long GB_IN_BYTES = MB_IN_BYTES * 1024; /** @hide */ public static final long TB_IN_BYTES = GB_IN_BYTES * 1024; + /** @hide */ + public static final long PB_IN_BYTES = TB_IN_BYTES * 1024; /** * Special UID value used when collecting {@link NetworkStatsHistory} for diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index b29e8d0..8114155 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -342,7 +342,9 @@ interface INetworkManagementService void setFirewallInterfaceRule(String iface, boolean allow); void setFirewallEgressSourceRule(String addr, boolean allow); void setFirewallEgressDestRule(String addr, int port, boolean allow); - void setFirewallUidRule(int uid, int rule); + void setFirewallUidRule(int chain, int uid, int rule); + void setFirewallUidRules(int chain, in int[] uids, in int[] rules); + void setFirewallChainEnabled(int chain, boolean enable); /** * Set all packets from users in ranges to go through VPN specified by netId. diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 7a1aa1e..6ef1cd0 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -392,6 +392,8 @@ public final class PowerManager { final IPowerManager mService; final Handler mHandler; + IDeviceIdleController mIDeviceIdleController; + /** * {@hide} */ @@ -892,6 +894,25 @@ public final class PowerManager { } /** + * Return whether the given application package name is on the device's power whitelist. + * Apps can be placed on the whitelist through the settings UI invoked by + * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}. + */ + public boolean isIgnoringBatteryOptimizations(String packageName) { + synchronized (this) { + if (mIDeviceIdleController == null) { + mIDeviceIdleController = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + } + } + try { + return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName); + } catch (RemoteException e) { + return false; + } + } + + /** * Turn off the device. * * @param confirm If true, shows a shutdown confirmation dialog. diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index ef7e747..00350ec 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -362,6 +362,18 @@ public class UserManager { public static final String DISALLOW_SMS = "no_sms"; /** + * Specifies if the user is not allowed to have fun. In some cases, the + * device owner may wish to prevent the user from experiencing amusement or + * joy while using the device. The default value is <code>false</code>. + * + * <p/>Key for user restrictions. + * <p/>Type: Boolean + * @see #setUserRestrictions(Bundle) + * @see #getUserRestrictions() + */ + public static final String DISALLOW_FUN = "no_fun"; + + /** * Specifies that windows besides app windows should not be * created. This will block the creation of the following types of windows. * <li>{@link LayoutParams#TYPE_TOAST}</li> diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 30535ff..c7ba607 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -107,6 +107,11 @@ public final class DocumentsContract { */ public static final String EXTRA_ORIENTATION = "android.content.extra.ORIENTATION"; + /** + * Overrides the default prompt text in DocumentsUI when set in an intent. + */ + public static final String EXTRA_PROMPT = "android.provider.extra.PROMPT"; + /** {@hide} */ public static final String ACTION_MANAGE_ROOT = "android.provider.action.MANAGE_ROOT"; /** {@hide} */ diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e335f6d..56cd1a7 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -579,13 +579,14 @@ public final class Settings { /** * Activity Action: Show screen for controlling which apps can ignore battery optimizations. * <p> - * In some cases, a matching Activity may not exist, so ensure you - * safeguard against this. - * <p> - * Input: The Intent's data URI specifies the application package name + * Input: Optionally, the Intent's data URI specifies the application package name * to be shown, with the "package" scheme. That is "package:com.my.app". * <p> * Output: Nothing. + * <p> + * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations + * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is + * already ignoring optimizations. */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = @@ -7132,6 +7133,29 @@ public final class Settings { public static final String APP_IDLE_CONSTANTS = "app_idle_constants"; /** + * Alarm manager specific settings. + * This is encoded as a key=value list, separated by commas. Ex: + * + * "min_futurity=5000,allow_while_idle_short_time=4500" + * + * The following keys are supported: + * + * <pre> + * min_futurity (long) + * min_interval (long) + * allow_while_idle_short_time (long) + * allow_while_idle_long_time (long) + * allow_while_idle_whitelist_duration (long) + * </pre> + * + * <p> + * Type: string + * @hide + * @see com.android.server.AlarmManagerService.Constants + */ + public static final String ALARM_MANAGER_CONSTANTS = "alarm_manager_constants"; + + /** * Get the key that retrieves a bluetooth headset's priority. * @hide */ @@ -7231,13 +7255,6 @@ public final class Settings { "preferred_network_mode"; /** - * Setting to 1 will hide carrier network settings. - * Default is 0. - */ - public static final String HIDE_CARRIER_NETWORK_SETTINGS = - "hide_carrier_network_settings"; - - /** * Name of an application package to be debugged. */ public static final String DEBUG_APP = "debug_app"; diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 6e40c6c..3fb93c4 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -81,7 +81,6 @@ public final class KeymasterDefs { public static final int KM_TAG_ASSOCIATED_DATA = KM_BYTES | 1000; public static final int KM_TAG_NONCE = KM_BYTES | 1001; - public static final int KM_TAG_AEAD_TAG = KM_BYTES | 1002; public static final int KM_TAG_AUTH_TOKEN = KM_BYTES | 1003; public static final int KM_TAG_MAC_LENGTH = KM_INT | 1004; diff --git a/core/java/android/security/keymaster/OperationResult.java b/core/java/android/security/keymaster/OperationResult.java index 911a05a..3065966 100644 --- a/core/java/android/security/keymaster/OperationResult.java +++ b/core/java/android/security/keymaster/OperationResult.java @@ -35,15 +35,28 @@ public class OperationResult implements Parcelable { public static final Parcelable.Creator<OperationResult> CREATOR = new Parcelable.Creator<OperationResult>() { + @Override public OperationResult createFromParcel(Parcel in) { return new OperationResult(in); } + @Override public OperationResult[] newArray(int length) { return new OperationResult[length]; } }; + public OperationResult( + int resultCode, IBinder token, long operationHandle, int inputConsumed, byte[] output, + KeymasterArguments outParams) { + this.resultCode = resultCode; + this.token = token; + this.operationHandle = operationHandle; + this.inputConsumed = inputConsumed; + this.output = output; + this.outParams = outParams; + } + protected OperationResult(Parcel in) { resultCode = in.readInt(); token = in.readStrongBinder(); diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index d5ee7e7..98c684c 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -80,7 +80,6 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall public static final int SHOW_WITH_ASSIST = 1<<0; /** - * @hide * Flag received in {@link #onShow}: originator requested that the session be started with * a screen shot of the currently focused activity. */ @@ -1143,7 +1142,7 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall mContentFrame.addView(view, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - + mContentFrame.requestApplyInsets(); } /** @hide */ @@ -1162,7 +1161,6 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall onHandleAssist(data); } - /** @hide */ public void onHandleScreenshot(Bitmap screenshot) { } diff --git a/core/java/android/speech/srec/MicrophoneInputStream.java b/core/java/android/speech/srec/MicrophoneInputStream.java deleted file mode 100644 index 94db176..0000000 --- a/core/java/android/speech/srec/MicrophoneInputStream.java +++ /dev/null @@ -1,110 +0,0 @@ -/*---------------------------------------------------------------------------* - * MicrophoneInputStream.java * - * * - * Copyright 2007 Nuance Communciations, Inc. * - * * - * 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.speech.srec; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.IllegalStateException; - - -/** - * PCM input stream from the microphone, 16 bits per sample. - */ -public final class MicrophoneInputStream extends InputStream { - static { - System.loadLibrary("srec_jni"); - } - - private final static String TAG = "MicrophoneInputStream"; - private long mAudioRecord = 0; - private byte[] mOneByte = new byte[1]; - - /** - * MicrophoneInputStream constructor. - * @param sampleRate sample rate of the microphone, typically 11025 or 8000. - * @param fifoDepth depth of the real time fifo, measured in sampleRate clock ticks. - * This determines how long an application may delay before losing data. - */ - public MicrophoneInputStream(int sampleRate, int fifoDepth) throws IOException { - mAudioRecord = AudioRecordNew(sampleRate, fifoDepth); - if (mAudioRecord == 0) throw new IOException("AudioRecord constructor failed - busy?"); - int status = AudioRecordStart(mAudioRecord); - if (status != 0) { - close(); - throw new IOException("AudioRecord start failed: " + status); - } - } - - @Override - public int read() throws IOException { - if (mAudioRecord == 0) throw new IllegalStateException("not open"); - int rtn = AudioRecordRead(mAudioRecord, mOneByte, 0, 1); - return rtn == 1 ? ((int)mOneByte[0] & 0xff) : -1; - } - - @Override - public int read(byte[] b) throws IOException { - if (mAudioRecord == 0) throw new IllegalStateException("not open"); - return AudioRecordRead(mAudioRecord, b, 0, b.length); - } - - @Override - public int read(byte[] b, int offset, int length) throws IOException { - if (mAudioRecord == 0) throw new IllegalStateException("not open"); - // TODO: should we force all reads to be a multiple of the sample size? - return AudioRecordRead(mAudioRecord, b, offset, length); - } - - /** - * Closes this stream. - */ - @Override - public void close() throws IOException { - if (mAudioRecord != 0) { - try { - AudioRecordStop(mAudioRecord); - } finally { - try { - AudioRecordDelete(mAudioRecord); - } finally { - mAudioRecord = 0; - } - } - } - } - - @Override - protected void finalize() throws Throwable { - if (mAudioRecord != 0) { - close(); - throw new IOException("someone forgot to close MicrophoneInputStream"); - } - } - - // - // AudioRecord JNI interface - // - private static native long AudioRecordNew(int sampleRate, int fifoDepth); - private static native int AudioRecordStart(long audioRecord); - private static native int AudioRecordRead(long audioRecord, byte[] b, int offset, int length) throws IOException; - private static native void AudioRecordStop(long audioRecord) throws IOException; - private static native void AudioRecordDelete(long audioRecord) throws IOException; -} diff --git a/core/java/android/speech/srec/Recognizer.java b/core/java/android/speech/srec/Recognizer.java deleted file mode 100644 index 6c491a0..0000000 --- a/core/java/android/speech/srec/Recognizer.java +++ /dev/null @@ -1,716 +0,0 @@ -/* - * --------------------------------------------------------------------------- - * Recognizer.java - * - * Copyright 2007 Nuance Communciations, Inc. - * - * 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.speech.srec; - -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.util.Locale; - -/** - * Simple, synchronous speech recognizer, using the Nuance SREC package. - * Usages proceeds as follows: - * - * <ul> - * <li>Create a <code>Recognizer</code>. - * <li>Create a <code>Recognizer.Grammar</code>. - * <li>Setup the <code>Recognizer.Grammar</code>. - * <li>Reset the <code>Recognizer.Grammar</code> slots, if needed. - * <li>Fill the <code>Recognizer.Grammar</code> slots, if needed. - * <li>Compile the <code>Recognizer.Grammar</code>, if needed. - * <li>Save the filled <code>Recognizer.Grammar</code>, if needed. - * <li>Start the <code>Recognizer</code>. - * <li>Loop over <code>advance</code> and <code>putAudio</code> until recognition complete. - * <li>Fetch and process results, or notify of failure. - * <li>Stop the <code>Recognizer</code>. - * <li>Destroy the <code>Recognizer</code>. - * </ul> - * - * <p>Below is example code</p> - * - * <pre class="prettyprint"> - * - * // create and start audio input - * InputStream audio = new MicrophoneInputStream(11025, 11025*5); - * // create a Recognizer - * String cdir = Recognizer.getConfigDir(null); - * Recognizer recognizer = new Recognizer(cdir + "/baseline11k.par"); - * // create and load a Grammar - * Recognizer.Grammar grammar = recognizer.new Grammar(cdir + "/grammars/VoiceDialer.g2g"); - * // setup the Grammar to work with the Recognizer - * grammar.setupRecognizer(); - * // fill the Grammar slots with names and save, if required - * grammar.resetAllSlots(); - * for (String name : names) grammar.addWordToSlot("@Names", name, null, 1, "V=1"); - * grammar.compile(); - * grammar.save(".../foo.g2g"); - * // start the Recognizer - * recognizer.start(); - * // loop over Recognizer events - * while (true) { - * switch (recognizer.advance()) { - * case Recognizer.EVENT_INCOMPLETE: - * case Recognizer.EVENT_STARTED: - * case Recognizer.EVENT_START_OF_VOICING: - * case Recognizer.EVENT_END_OF_VOICING: - * // let the Recognizer continue to run - * continue; - * case Recognizer.EVENT_RECOGNITION_RESULT: - * // success, so fetch results here! - * for (int i = 0; i < recognizer.getResultCount(); i++) { - * String result = recognizer.getResult(i, Recognizer.KEY_LITERAL); - * } - * break; - * case Recognizer.EVENT_NEED_MORE_AUDIO: - * // put more audio in the Recognizer - * recognizer.putAudio(audio); - * continue; - * default: - * notifyFailure(); - * break; - * } - * break; - * } - * // stop the Recognizer - * recognizer.stop(); - * // destroy the Recognizer - * recognizer.destroy(); - * // stop the audio device - * audio.close(); - * - * </pre> - */ -public final class Recognizer { - static { - System.loadLibrary("srec_jni"); - } - - private static String TAG = "Recognizer"; - - /** - * Result key corresponding to confidence score. - */ - public static final String KEY_CONFIDENCE = "conf"; - - /** - * Result key corresponding to literal text. - */ - public static final String KEY_LITERAL = "literal"; - - /** - * Result key corresponding to semantic meaning text. - */ - public static final String KEY_MEANING = "meaning"; - - // handle to SR_Vocabulary object - private long mVocabulary = 0; - - // handle to SR_Recognizer object - private long mRecognizer = 0; - - // Grammar currently associated with Recognizer via SR_GrammarSetupRecognizer - private Grammar mActiveGrammar = null; - - /** - * Get the pathname of the SREC configuration directory corresponding to the - * language indicated by the Locale. - * This directory contains dictionaries, speech models, - * configuration files, and other data needed by the Recognizer. - * @param locale <code>Locale</code> corresponding to the desired language, - * or null for default, currently <code>Locale.US</code>. - * @return Pathname of the configuration directory. - */ - public static String getConfigDir(Locale locale) { - if (locale == null) locale = Locale.US; - String dir = "/system/usr/srec/config/" + - locale.toString().replace('_', '.').toLowerCase(Locale.ROOT); - if ((new File(dir)).isDirectory()) return dir; - return null; - } - - /** - * Create an instance of a SREC speech recognizer. - * - * @param configFile pathname of the baseline*.par configuration file, - * which in turn contains references to dictionaries, speech models, - * and other data needed to configure and operate the recognizer. - * A separate config file is needed for each audio sample rate. - * Two files, baseline11k.par and baseline8k.par, which correspond to - * 11025 and 8000 hz, are present in the directory indicated by - * {@link #getConfigDir}. - * @throws IOException - */ - public Recognizer(String configFile) throws IOException { - PMemInit(); - SR_SessionCreate(configFile); - mRecognizer = SR_RecognizerCreate(); - SR_RecognizerSetup(mRecognizer); - mVocabulary = SR_VocabularyLoad(); - } - - /** - * Represents a grammar loaded into the Recognizer. - */ - public class Grammar { - private long mGrammar = 0; - - /** - * Create a <code>Grammar</code> instance. - * @param g2gFileName pathname of g2g file. - */ - public Grammar(String g2gFileName) throws IOException { - mGrammar = SR_GrammarLoad(g2gFileName); - SR_GrammarSetupVocabulary(mGrammar, mVocabulary); - } - - /** - * Reset all slots. - */ - public void resetAllSlots() { - SR_GrammarResetAllSlots(mGrammar); - } - - /** - * Add a word to a slot. - * - * @param slot slot name. - * @param word word to insert. - * @param pron pronunciation, or null to derive from word. - * @param weight weight to give the word. One is normal, 50 is low. - * @param tag semantic meaning tag string. - */ - public void addWordToSlot(String slot, String word, String pron, int weight, String tag) { - SR_GrammarAddWordToSlot(mGrammar, slot, word, pron, weight, tag); - } - - /** - * Compile all slots. - */ - public void compile() { - SR_GrammarCompile(mGrammar); - } - - /** - * Setup <code>Grammar</code> with <code>Recognizer</code>. - */ - public void setupRecognizer() { - SR_GrammarSetupRecognizer(mGrammar, mRecognizer); - mActiveGrammar = this; - } - - /** - * Save <code>Grammar</code> to g2g file. - * - * @param g2gFileName - * @throws IOException - */ - public void save(String g2gFileName) throws IOException { - SR_GrammarSave(mGrammar, g2gFileName); - } - - /** - * Release resources associated with this <code>Grammar</code>. - */ - public void destroy() { - // TODO: need to do cleanup and disassociation with Recognizer - if (mGrammar != 0) { - SR_GrammarDestroy(mGrammar); - mGrammar = 0; - } - } - - /** - * Clean up resources. - */ - protected void finalize() { - if (mGrammar != 0) { - destroy(); - throw new IllegalStateException("someone forgot to destroy Grammar"); - } - } - } - - /** - * Start recognition - */ - public void start() { - // TODO: shouldn't be here? - SR_RecognizerActivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash", 1); - SR_RecognizerStart(mRecognizer); - } - - /** - * Process some audio and return the current status. - * @return recognition event, one of: - * <ul> - * <li><code>EVENT_INVALID</code> - * <li><code>EVENT_NO_MATCH</code> - * <li><code>EVENT_INCOMPLETE</code> - * <li><code>EVENT_STARTED</code> - * <li><code>EVENT_STOPPED</code> - * <li><code>EVENT_START_OF_VOICING</code> - * <li><code>EVENT_END_OF_VOICING</code> - * <li><code>EVENT_SPOKE_TOO_SOON</code> - * <li><code>EVENT_RECOGNITION_RESULT</code> - * <li><code>EVENT_START_OF_UTTERANCE_TIMEOUT</code> - * <li><code>EVENT_RECOGNITION_TIMEOUT</code> - * <li><code>EVENT_NEED_MORE_AUDIO</code> - * <li><code>EVENT_MAX_SPEECH</code> - * </ul> - */ - public int advance() { - return SR_RecognizerAdvance(mRecognizer); - } - - /** - * Put audio samples into the <code>Recognizer</code>. - * @param buf holds the audio samples. - * @param offset offset of the first sample. - * @param length number of bytes containing samples. - * @param isLast indicates no more audio data, normally false. - * @return number of bytes accepted. - */ - public int putAudio(byte[] buf, int offset, int length, boolean isLast) { - return SR_RecognizerPutAudio(mRecognizer, buf, offset, length, isLast); - } - - /** - * Read audio samples from an <code>InputStream</code> and put them in the - * <code>Recognizer</code>. - * @param audio <code>InputStream</code> containing PCM audio samples. - */ - public void putAudio(InputStream audio) throws IOException { - // make sure the audio buffer is allocated - if (mPutAudioBuffer == null) mPutAudioBuffer = new byte[512]; - // read some data - int nbytes = audio.read(mPutAudioBuffer); - // eof, so signal Recognizer - if (nbytes == -1) { - SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, 0, true); - } - // put it into the Recognizer - else if (nbytes != SR_RecognizerPutAudio(mRecognizer, mPutAudioBuffer, 0, nbytes, false)) { - throw new IOException("SR_RecognizerPutAudio failed nbytes=" + nbytes); - } - } - - // audio buffer for putAudio(InputStream) - private byte[] mPutAudioBuffer = null; - - /** - * Get the number of recognition results. Must be called after - * <code>EVENT_RECOGNITION_RESULT</code> is returned by - * <code>advance</code>, but before <code>stop</code>. - * - * @return number of results in nbest list. - */ - public int getResultCount() { - return SR_RecognizerResultGetSize(mRecognizer); - } - - /** - * Get a set of keys for the result. Must be called after - * <code>EVENT_RECOGNITION_RESULT</code> is returned by - * <code>advance</code>, but before <code>stop</code>. - * - * @param index index of result. - * @return array of keys. - */ - public String[] getResultKeys(int index) { - return SR_RecognizerResultGetKeyList(mRecognizer, index); - } - - /** - * Get a result value. Must be called after - * <code>EVENT_RECOGNITION_RESULT</code> is returned by - * <code>advance</code>, but before <code>stop</code>. - * - * @param index index of the result. - * @param key key of the result. This is typically one of - * <code>KEY_CONFIDENCE</code>, <code>KEY_LITERAL</code>, or - * <code>KEY_MEANING</code>, but the user can also define their own keys - * in a grxml file, or in the <code>tag</code> slot of - * <code>Grammar.addWordToSlot</code>. - * @return the result. - */ - public String getResult(int index, String key) { - return SR_RecognizerResultGetValue(mRecognizer, index, key); - } - - /** - * Stop the <code>Recognizer</code>. - */ - public void stop() { - SR_RecognizerStop(mRecognizer); - SR_RecognizerDeactivateRule(mRecognizer, mActiveGrammar.mGrammar, "trash"); - } - - /** - * Reset the acoustic state vectorto it's default value. - * - * @hide - */ - public void resetAcousticState() { - SR_AcousticStateReset(mRecognizer); - } - - /** - * Set the acoustic state vector. - * @param state String containing the acoustic state vector. - * - * @hide - */ - public void setAcousticState(String state) { - SR_AcousticStateSet(mRecognizer, state); - } - - /** - * Get the acoustic state vector. - * @return String containing the acoustic state vector. - * - * @hide - */ - public String getAcousticState() { - return SR_AcousticStateGet(mRecognizer); - } - - /** - * Clean up resources. - */ - public void destroy() { - try { - if (mVocabulary != 0) SR_VocabularyDestroy(mVocabulary); - } finally { - mVocabulary = 0; - try { - if (mRecognizer != 0) SR_RecognizerUnsetup(mRecognizer); - } finally { - try { - if (mRecognizer != 0) SR_RecognizerDestroy(mRecognizer); - } finally { - mRecognizer = 0; - try { - SR_SessionDestroy(); - } finally { - PMemShutdown(); - } - } - } - } - } - - /** - * Clean up resources. - */ - protected void finalize() throws Throwable { - if (mVocabulary != 0 || mRecognizer != 0) { - destroy(); - throw new IllegalStateException("someone forgot to destroy Recognizer"); - } - } - - /* an example session captured, for reference - void doall() { - if (PMemInit ( ) - || lhs_audioinOpen ( WAVE_MAPPER, SREC_TEST_DEFAULT_AUDIO_FREQUENCY, &audio_in_handle ) - || srec_test_init_application_data ( &applicationData, argc, argv ) - || SR_SessionCreate ( "/system/usr/srec/config/en.us/baseline11k.par" ) - || SR_RecognizerCreate ( &applicationData.recognizer ) - || SR_RecognizerSetup ( applicationData.recognizer) - || ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &flen ) - || SR_VocabularyLoad ( filename, &applicationData.vocabulary ) - || SR_VocabularyGetLanguage ( applicationData.vocabulary, &applicationData.locale ) - || (applicationData.nametag = NULL) - || SR_NametagsCreate ( &applicationData.nametags ) - || (LSTRCPY ( applicationData.grammars [0].grammar_path, "/system/usr/srec/config/en.us/grammars/VoiceDialer.g2g" ), 0) - || (LSTRCPY ( applicationData.grammars [0].grammarID, "BothTags" ), 0) - || (LSTRCPY ( applicationData.grammars [0].ruleName, "trash" ), 0) - || (applicationData.grammars [0].is_ve_grammar = ESR_FALSE, 0) - || SR_GrammarLoad (applicationData.grammars [0].grammar_path, &applicationData.grammars [applicationData.grammarCount].grammar ) - || SR_GrammarSetupVocabulary ( applicationData.grammars [0].grammar, applicationData.vocabulary ) - || SR_GrammarSetupRecognizer( applicationData.grammars [0].grammar, applicationData.recognizer ) - || SR_GrammarSetDispatchFunction ( applicationData.grammars [0].grammar, L("myDSMCallback"), NULL, myDSMCallback ) - || (applicationData.grammarCount++, 0) - || SR_RecognizerActivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar, - applicationData.grammars [0].ruleName, 1 ) - || (applicationData.active_grammar_num = 0, 0) - || lhs_audioinStart ( audio_in_handle ) - || SR_RecognizerStart ( applicationData.recognizer ) - || strl ( applicationData.grammars [0].grammar, &applicationData, audio_in_handle, &recognition_count ) - || SR_RecognizerStop ( applicationData.recognizer ) - || lhs_audioinStop ( audio_in_handle ) - || SR_RecognizerDeactivateRule ( applicationData.recognizer, applicationData.grammars [0].grammar, applicationData.grammars [0].ruleName ) - || (applicationData.active_grammar_num = -1, 0) - || SR_GrammarDestroy ( applicationData.grammars [0].grammar ) - || (applicationData.grammarCount--, 0) - || SR_NametagsDestroy ( applicationData.nametags ) - || (applicationData.nametags = NULL, 0) - || SR_VocabularyDestroy ( applicationData.vocabulary ) - || (applicationData.vocabulary = NULL) - || SR_RecognizerUnsetup ( applicationData.recognizer) // releases acoustic models - || SR_RecognizerDestroy ( applicationData.recognizer ) - || (applicationData.recognizer = NULL) - || SR_SessionDestroy ( ) - || srec_test_shutdown_application_data ( &applicationData ) - || lhs_audioinClose ( &audio_in_handle ) - || PMemShutdown ( ) - } - */ - - - // - // PMem native methods - // - private static native void PMemInit(); - private static native void PMemShutdown(); - - - // - // SR_Session native methods - // - private static native void SR_SessionCreate(String filename); - private static native void SR_SessionDestroy(); - - - // - // SR_Recognizer native methods - // - - /** - * Reserved value. - */ - public final static int EVENT_INVALID = 0; - - /** - * <code>Recognizer</code> could not find a match for the utterance. - */ - public final static int EVENT_NO_MATCH = 1; - - /** - * <code>Recognizer</code> processed one frame of audio. - */ - public final static int EVENT_INCOMPLETE = 2; - - /** - * <code>Recognizer</code> has just been started. - */ - public final static int EVENT_STARTED = 3; - - /** - * <code>Recognizer</code> is stopped. - */ - public final static int EVENT_STOPPED = 4; - - /** - * Beginning of speech detected. - */ - public final static int EVENT_START_OF_VOICING = 5; - - /** - * End of speech detected. - */ - public final static int EVENT_END_OF_VOICING = 6; - - /** - * Beginning of utterance occured too soon. - */ - public final static int EVENT_SPOKE_TOO_SOON = 7; - - /** - * Recognition match detected. - */ - public final static int EVENT_RECOGNITION_RESULT = 8; - - /** - * Timeout occured before beginning of utterance. - */ - public final static int EVENT_START_OF_UTTERANCE_TIMEOUT = 9; - - /** - * Timeout occured before speech recognition could complete. - */ - public final static int EVENT_RECOGNITION_TIMEOUT = 10; - - /** - * Not enough samples to process one frame. - */ - public final static int EVENT_NEED_MORE_AUDIO = 11; - - /** - * More audio encountered than is allowed by 'swirec_max_speech_duration'. - */ - public final static int EVENT_MAX_SPEECH = 12; - - /** - * Produce a displayable string from an <code>advance</code> event. - * @param event - * @return String representing the event. - */ - public static String eventToString(int event) { - switch (event) { - case EVENT_INVALID: - return "EVENT_INVALID"; - case EVENT_NO_MATCH: - return "EVENT_NO_MATCH"; - case EVENT_INCOMPLETE: - return "EVENT_INCOMPLETE"; - case EVENT_STARTED: - return "EVENT_STARTED"; - case EVENT_STOPPED: - return "EVENT_STOPPED"; - case EVENT_START_OF_VOICING: - return "EVENT_START_OF_VOICING"; - case EVENT_END_OF_VOICING: - return "EVENT_END_OF_VOICING"; - case EVENT_SPOKE_TOO_SOON: - return "EVENT_SPOKE_TOO_SOON"; - case EVENT_RECOGNITION_RESULT: - return "EVENT_RECOGNITION_RESULT"; - case EVENT_START_OF_UTTERANCE_TIMEOUT: - return "EVENT_START_OF_UTTERANCE_TIMEOUT"; - case EVENT_RECOGNITION_TIMEOUT: - return "EVENT_RECOGNITION_TIMEOUT"; - case EVENT_NEED_MORE_AUDIO: - return "EVENT_NEED_MORE_AUDIO"; - case EVENT_MAX_SPEECH: - return "EVENT_MAX_SPEECH"; - } - return "EVENT_" + event; - } - - // - // SR_Recognizer methods - // - private static native void SR_RecognizerStart(long recognizer); - private static native void SR_RecognizerStop(long recognizer); - private static native long SR_RecognizerCreate(); - private static native void SR_RecognizerDestroy(long recognizer); - private static native void SR_RecognizerSetup(long recognizer); - private static native void SR_RecognizerUnsetup(long recognizer); - private static native boolean SR_RecognizerIsSetup(long recognizer); - private static native String SR_RecognizerGetParameter(long recognizer, String key); - private static native int SR_RecognizerGetSize_tParameter(long recognizer, String key); - private static native boolean SR_RecognizerGetBoolParameter(long recognizer, String key); - private static native void SR_RecognizerSetParameter(long recognizer, String key, String value); - private static native void SR_RecognizerSetSize_tParameter(long recognizer, - String key, int value); - private static native void SR_RecognizerSetBoolParameter(long recognizer, String key, - boolean value); - private static native void SR_RecognizerSetupRule(long recognizer, long grammar, - String ruleName); - private static native boolean SR_RecognizerHasSetupRules(long recognizer); - private static native void SR_RecognizerActivateRule(long recognizer, long grammar, - String ruleName, int weight); - private static native void SR_RecognizerDeactivateRule(long recognizer, long grammar, - String ruleName); - private static native void SR_RecognizerDeactivateAllRules(long recognizer); - private static native boolean SR_RecognizerIsActiveRule(long recognizer, long grammar, - String ruleName); - private static native boolean SR_RecognizerCheckGrammarConsistency(long recognizer, - long grammar); - private static native int SR_RecognizerPutAudio(long recognizer, byte[] buffer, int offset, - int length, boolean isLast); - private static native int SR_RecognizerAdvance(long recognizer); - // private static native void SR_RecognizerLoadUtterance(long recognizer, - // const LCHAR* filename); - // private static native void SR_RecognizerLoadWaveFile(long recognizer, - // const LCHAR* filename); - // private static native void SR_RecognizerSetLockFunction(long recognizer, - // SR_RecognizerLockFunction function, void* data); - private static native boolean SR_RecognizerIsSignalClipping(long recognizer); - private static native boolean SR_RecognizerIsSignalDCOffset(long recognizer); - private static native boolean SR_RecognizerIsSignalNoisy(long recognizer); - private static native boolean SR_RecognizerIsSignalTooQuiet(long recognizer); - private static native boolean SR_RecognizerIsSignalTooFewSamples(long recognizer); - private static native boolean SR_RecognizerIsSignalTooManySamples(long recognizer); - // private static native void SR_Recognizer_Change_Sample_Rate (size_t new_sample_rate); - - - // - // SR_AcousticState native methods - // - private static native void SR_AcousticStateReset(long recognizer); - private static native void SR_AcousticStateSet(long recognizer, String state); - private static native String SR_AcousticStateGet(long recognizer); - - - // - // SR_Grammar native methods - // - private static native void SR_GrammarCompile(long grammar); - private static native void SR_GrammarAddWordToSlot(long grammar, String slot, - String word, String pronunciation, int weight, String tag); - private static native void SR_GrammarResetAllSlots(long grammar); - // private static native void SR_GrammarAddNametagToSlot(long grammar, String slot, - // const struct SR_Nametag_t* nametag, int weight, String tag); - private static native void SR_GrammarSetupVocabulary(long grammar, long vocabulary); - // private static native void SR_GrammarSetupModels(long grammar, SR_AcousticModels* models); - private static native void SR_GrammarSetupRecognizer(long grammar, long recognizer); - private static native void SR_GrammarUnsetupRecognizer(long grammar); - // private static native void SR_GrammarGetModels(long grammar,SR_AcousticModels** models); - private static native long SR_GrammarCreate(); - private static native void SR_GrammarDestroy(long grammar); - private static native long SR_GrammarLoad(String filename); - private static native void SR_GrammarSave(long grammar, String filename); - // private static native void SR_GrammarSetDispatchFunction(long grammar, - // const LCHAR* name, void* userData, SR_GrammarDispatchFunction function); - // private static native void SR_GrammarSetParameter(long grammar, const - // LCHAR* key, void* value); - // private static native void SR_GrammarSetSize_tParameter(long grammar, - // const LCHAR* key, size_t value); - // private static native void SR_GrammarGetParameter(long grammar, const - // LCHAR* key, void** value); - // private static native void SR_GrammarGetSize_tParameter(long grammar, - // const LCHAR* key, size_t* value); - // private static native void SR_GrammarCheckParse(long grammar, const LCHAR* - // transcription, SR_SemanticResult** result, size_t* resultCount); - private static native void SR_GrammarAllowOnly(long grammar, String transcription); - private static native void SR_GrammarAllowAll(long grammar); - - - // - // SR_Vocabulary native methods - // - // private static native int SR_VocabularyCreate(); - private static native long SR_VocabularyLoad(); - // private static native void SR_VocabularySave(SR_Vocabulary* self, - // const LCHAR* filename); - // private static native void SR_VocabularyAddWord(SR_Vocabulary* self, - // const LCHAR* word); - // private static native void SR_VocabularyGetLanguage(SR_Vocabulary* self, - // ESR_Locale* locale); - private static native void SR_VocabularyDestroy(long vocabulary); - private static native String SR_VocabularyGetPronunciation(long vocabulary, String word); - - - // - // SR_RecognizerResult native methods - // - private static native byte[] SR_RecognizerResultGetWaveform(long recognizer); - private static native int SR_RecognizerResultGetSize(long recognizer); - private static native int SR_RecognizerResultGetKeyCount(long recognizer, int nbest); - private static native String[] SR_RecognizerResultGetKeyList(long recognizer, int nbest); - private static native String SR_RecognizerResultGetValue(long recognizer, - int nbest, String key); - // private static native void SR_RecognizerResultGetLocale(long recognizer, ESR_Locale* locale); -} diff --git a/core/java/android/speech/srec/UlawEncoderInputStream.java b/core/java/android/speech/srec/UlawEncoderInputStream.java deleted file mode 100644 index a488ead..0000000 --- a/core/java/android/speech/srec/UlawEncoderInputStream.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * --------------------------------------------------------------------------- - * UlawEncoderInputStream.java - * - * Copyright 2008 Nuance Communciations, Inc. - * - * 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.speech.srec; - -import java.io.IOException; -import java.io.InputStream; - -/** - * InputStream which transforms 16 bit pcm data to ulaw data. - * - * Not yet ready to be supported, so - * @hide - */ -public final class UlawEncoderInputStream extends InputStream { - private final static String TAG = "UlawEncoderInputStream"; - - private final static int MAX_ULAW = 8192; - private final static int SCALE_BITS = 16; - - private InputStream mIn; - - private int mMax = 0; - - private final byte[] mBuf = new byte[1024]; - private int mBufCount = 0; // should be 0 or 1 - - private final byte[] mOneByte = new byte[1]; - - - public static void encode(byte[] pcmBuf, int pcmOffset, - byte[] ulawBuf, int ulawOffset, int length, int max) { - - // from 'ulaw' in wikipedia - // +8191 to +8159 0x80 - // +8158 to +4063 in 16 intervals of 256 0x80 + interval number - // +4062 to +2015 in 16 intervals of 128 0x90 + interval number - // +2014 to +991 in 16 intervals of 64 0xA0 + interval number - // +990 to +479 in 16 intervals of 32 0xB0 + interval number - // +478 to +223 in 16 intervals of 16 0xC0 + interval number - // +222 to +95 in 16 intervals of 8 0xD0 + interval number - // +94 to +31 in 16 intervals of 4 0xE0 + interval number - // +30 to +1 in 15 intervals of 2 0xF0 + interval number - // 0 0xFF - - // -1 0x7F - // -31 to -2 in 15 intervals of 2 0x70 + interval number - // -95 to -32 in 16 intervals of 4 0x60 + interval number - // -223 to -96 in 16 intervals of 8 0x50 + interval number - // -479 to -224 in 16 intervals of 16 0x40 + interval number - // -991 to -480 in 16 intervals of 32 0x30 + interval number - // -2015 to -992 in 16 intervals of 64 0x20 + interval number - // -4063 to -2016 in 16 intervals of 128 0x10 + interval number - // -8159 to -4064 in 16 intervals of 256 0x00 + interval number - // -8192 to -8160 0x00 - - // set scale factors - if (max <= 0) max = MAX_ULAW; - - int coef = MAX_ULAW * (1 << SCALE_BITS) / max; - - for (int i = 0; i < length; i++) { - int pcm = (0xff & pcmBuf[pcmOffset++]) + (pcmBuf[pcmOffset++] << 8); - pcm = (pcm * coef) >> SCALE_BITS; - - int ulaw; - if (pcm >= 0) { - ulaw = pcm <= 0 ? 0xff : - pcm <= 30 ? 0xf0 + (( 30 - pcm) >> 1) : - pcm <= 94 ? 0xe0 + (( 94 - pcm) >> 2) : - pcm <= 222 ? 0xd0 + (( 222 - pcm) >> 3) : - pcm <= 478 ? 0xc0 + (( 478 - pcm) >> 4) : - pcm <= 990 ? 0xb0 + (( 990 - pcm) >> 5) : - pcm <= 2014 ? 0xa0 + ((2014 - pcm) >> 6) : - pcm <= 4062 ? 0x90 + ((4062 - pcm) >> 7) : - pcm <= 8158 ? 0x80 + ((8158 - pcm) >> 8) : - 0x80; - } else { - ulaw = -1 <= pcm ? 0x7f : - -31 <= pcm ? 0x70 + ((pcm - -31) >> 1) : - -95 <= pcm ? 0x60 + ((pcm - -95) >> 2) : - -223 <= pcm ? 0x50 + ((pcm - -223) >> 3) : - -479 <= pcm ? 0x40 + ((pcm - -479) >> 4) : - -991 <= pcm ? 0x30 + ((pcm - -991) >> 5) : - -2015 <= pcm ? 0x20 + ((pcm - -2015) >> 6) : - -4063 <= pcm ? 0x10 + ((pcm - -4063) >> 7) : - -8159 <= pcm ? 0x00 + ((pcm - -8159) >> 8) : - 0x00; - } - ulawBuf[ulawOffset++] = (byte)ulaw; - } - } - - /** - * Compute the maximum of the absolute value of the pcm samples. - * The return value can be used to set ulaw encoder scaling. - * @param pcmBuf array containing 16 bit pcm data. - * @param offset offset of start of 16 bit pcm data. - * @param length number of pcm samples (not number of input bytes) - * @return maximum abs of pcm data values - */ - public static int maxAbsPcm(byte[] pcmBuf, int offset, int length) { - int max = 0; - for (int i = 0; i < length; i++) { - int pcm = (0xff & pcmBuf[offset++]) + (pcmBuf[offset++] << 8); - if (pcm < 0) pcm = -pcm; - if (pcm > max) max = pcm; - } - return max; - } - - /** - * Create an InputStream which takes 16 bit pcm data and produces ulaw data. - * @param in InputStream containing 16 bit pcm data. - * @param max pcm value corresponding to maximum ulaw value. - */ - public UlawEncoderInputStream(InputStream in, int max) { - mIn = in; - mMax = max; - } - - @Override - public int read(byte[] buf, int offset, int length) throws IOException { - if (mIn == null) throw new IllegalStateException("not open"); - - // return at least one byte, but try to fill 'length' - while (mBufCount < 2) { - int n = mIn.read(mBuf, mBufCount, Math.min(length * 2, mBuf.length - mBufCount)); - if (n == -1) return -1; - mBufCount += n; - } - - // compand data - int n = Math.min(mBufCount / 2, length); - encode(mBuf, 0, buf, offset, n, mMax); - - // move data to bottom of mBuf - mBufCount -= n * 2; - for (int i = 0; i < mBufCount; i++) mBuf[i] = mBuf[i + n * 2]; - - return n; - } - - @Override - public int read(byte[] buf) throws IOException { - return read(buf, 0, buf.length); - } - - @Override - public int read() throws IOException { - int n = read(mOneByte, 0, 1); - if (n == -1) return -1; - return 0xff & (int)mOneByte[0]; - } - - @Override - public void close() throws IOException { - if (mIn != null) { - InputStream in = mIn; - mIn = null; - in.close(); - } - } - - @Override - public int available() throws IOException { - return (mIn.available() + mBufCount) / 2; - } -} diff --git a/core/java/android/speech/srec/WaveHeader.java b/core/java/android/speech/srec/WaveHeader.java deleted file mode 100644 index 4c3b172..0000000 --- a/core/java/android/speech/srec/WaveHeader.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.speech.srec; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * This class represents the header of a WAVE format audio file, which usually - * have a .wav suffix. The following integer valued fields are contained: - * <ul> - * <li> format - usually PCM, ALAW or ULAW. - * <li> numChannels - 1 for mono, 2 for stereo. - * <li> sampleRate - usually 8000, 11025, 16000, 22050, or 44100 hz. - * <li> bitsPerSample - usually 16 for PCM, 8 for ALAW, or 8 for ULAW. - * <li> numBytes - size of audio data after this header, in bytes. - * </ul> - * - * Not yet ready to be supported, so - * @hide - */ -public class WaveHeader { - - // follows WAVE format in http://ccrma.stanford.edu/courses/422/projects/WaveFormat - - private static final String TAG = "WaveHeader"; - - private static final int HEADER_LENGTH = 44; - - /** Indicates PCM format. */ - public static final short FORMAT_PCM = 1; - /** Indicates ALAW format. */ - public static final short FORMAT_ALAW = 6; - /** Indicates ULAW format. */ - public static final short FORMAT_ULAW = 7; - - private short mFormat; - private short mNumChannels; - private int mSampleRate; - private short mBitsPerSample; - private int mNumBytes; - - /** - * Construct a WaveHeader, with all fields defaulting to zero. - */ - public WaveHeader() { - } - - /** - * Construct a WaveHeader, with fields initialized. - * @param format format of audio data, - * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. - * @param numChannels 1 for mono, 2 for stereo. - * @param sampleRate typically 8000, 11025, 16000, 22050, or 44100 hz. - * @param bitsPerSample usually 16 for PCM, 8 for ULAW or 8 for ALAW. - * @param numBytes size of audio data after this header, in bytes. - */ - public WaveHeader(short format, short numChannels, int sampleRate, short bitsPerSample, int numBytes) { - mFormat = format; - mSampleRate = sampleRate; - mNumChannels = numChannels; - mBitsPerSample = bitsPerSample; - mNumBytes = numBytes; - } - - /** - * Get the format field. - * @return format field, - * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. - */ - public short getFormat() { - return mFormat; - } - - /** - * Set the format field. - * @param format - * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. - * @return reference to this WaveHeader instance. - */ - public WaveHeader setFormat(short format) { - mFormat = format; - return this; - } - - /** - * Get the number of channels. - * @return number of channels, 1 for mono, 2 for stereo. - */ - public short getNumChannels() { - return mNumChannels; - } - - /** - * Set the number of channels. - * @param numChannels 1 for mono, 2 for stereo. - * @return reference to this WaveHeader instance. - */ - public WaveHeader setNumChannels(short numChannels) { - mNumChannels = numChannels; - return this; - } - - /** - * Get the sample rate. - * @return sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz. - */ - public int getSampleRate() { - return mSampleRate; - } - - /** - * Set the sample rate. - * @param sampleRate sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz. - * @return reference to this WaveHeader instance. - */ - public WaveHeader setSampleRate(int sampleRate) { - mSampleRate = sampleRate; - return this; - } - - /** - * Get the number of bits per sample. - * @return number of bits per sample, - * usually 16 for PCM, 8 for ULAW or 8 for ALAW. - */ - public short getBitsPerSample() { - return mBitsPerSample; - } - - /** - * Set the number of bits per sample. - * @param bitsPerSample number of bits per sample, - * usually 16 for PCM, 8 for ULAW or 8 for ALAW. - * @return reference to this WaveHeader instance. - */ - public WaveHeader setBitsPerSample(short bitsPerSample) { - mBitsPerSample = bitsPerSample; - return this; - } - - /** - * Get the size of audio data after this header, in bytes. - * @return size of audio data after this header, in bytes. - */ - public int getNumBytes() { - return mNumBytes; - } - - /** - * Set the size of audio data after this header, in bytes. - * @param numBytes size of audio data after this header, in bytes. - * @return reference to this WaveHeader instance. - */ - public WaveHeader setNumBytes(int numBytes) { - mNumBytes = numBytes; - return this; - } - - /** - * Read and initialize a WaveHeader. - * @param in {@link java.io.InputStream} to read from. - * @return number of bytes consumed. - * @throws IOException - */ - public int read(InputStream in) throws IOException { - /* RIFF header */ - readId(in, "RIFF"); - int numBytes = readInt(in) - 36; - readId(in, "WAVE"); - - /* fmt chunk */ - readId(in, "fmt "); - if (16 != readInt(in)) throw new IOException("fmt chunk length not 16"); - mFormat = readShort(in); - mNumChannels = readShort(in); - mSampleRate = readInt(in); - int byteRate = readInt(in); - short blockAlign = readShort(in); - mBitsPerSample = readShort(in); - if (byteRate != mNumChannels * mSampleRate * mBitsPerSample / 8) { - throw new IOException("fmt.ByteRate field inconsistent"); - } - if (blockAlign != mNumChannels * mBitsPerSample / 8) { - throw new IOException("fmt.BlockAlign field inconsistent"); - } - - /* data chunk */ - readId(in, "data"); - mNumBytes = readInt(in); - - return HEADER_LENGTH; - } - - private static void readId(InputStream in, String id) throws IOException { - for (int i = 0; i < id.length(); i++) { - if (id.charAt(i) != in.read()) throw new IOException( id + " tag not present"); - } - } - - private static int readInt(InputStream in) throws IOException { - return in.read() | (in.read() << 8) | (in.read() << 16) | (in.read() << 24); - } - - private static short readShort(InputStream in) throws IOException { - return (short)(in.read() | (in.read() << 8)); - } - - /** - * Write a WAVE file header. - * @param out {@link java.io.OutputStream} to receive the header. - * @return number of bytes written. - * @throws IOException - */ - public int write(OutputStream out) throws IOException { - /* RIFF header */ - writeId(out, "RIFF"); - writeInt(out, 36 + mNumBytes); - writeId(out, "WAVE"); - - /* fmt chunk */ - writeId(out, "fmt "); - writeInt(out, 16); - writeShort(out, mFormat); - writeShort(out, mNumChannels); - writeInt(out, mSampleRate); - writeInt(out, mNumChannels * mSampleRate * mBitsPerSample / 8); - writeShort(out, (short)(mNumChannels * mBitsPerSample / 8)); - writeShort(out, mBitsPerSample); - - /* data chunk */ - writeId(out, "data"); - writeInt(out, mNumBytes); - - return HEADER_LENGTH; - } - - private static void writeId(OutputStream out, String id) throws IOException { - for (int i = 0; i < id.length(); i++) out.write(id.charAt(i)); - } - - private static void writeInt(OutputStream out, int val) throws IOException { - out.write(val >> 0); - out.write(val >> 8); - out.write(val >> 16); - out.write(val >> 24); - } - - private static void writeShort(OutputStream out, short val) throws IOException { - out.write(val >> 0); - out.write(val >> 8); - } - - @Override - public String toString() { - return String.format( - "WaveHeader format=%d numChannels=%d sampleRate=%d bitsPerSample=%d numBytes=%d", - mFormat, mNumChannels, mSampleRate, mBitsPerSample, mNumBytes); - } - -} diff --git a/core/java/android/speech/srec/package.html b/core/java/android/speech/srec/package.html deleted file mode 100644 index 9a99df8..0000000 --- a/core/java/android/speech/srec/package.html +++ /dev/null @@ -1,6 +0,0 @@ -<HTML> -<BODY> -Simple, synchronous SREC speech recognition API. -@hide -</BODY> -</HTML> diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java index b467f5a..13a959e 100644 --- a/core/java/android/text/format/Formatter.java +++ b/core/java/android/text/format/Formatter.java @@ -17,7 +17,9 @@ package android.text.format; import android.content.Context; +import android.content.res.Resources; import android.net.NetworkUtils; +import android.net.TrafficStats; /** * Utility class to aid in formatting common values that are not covered @@ -25,63 +27,88 @@ import android.net.NetworkUtils; */ public final class Formatter { + /** {@hide} */ + public static final int FLAG_SHORTER = 1 << 0; + /** {@hide} */ + public static final int FLAG_CALCULATE_ROUNDED = 1 << 1; + + /** {@hide} */ + public static class BytesResult { + public final String value; + public final String units; + public final long roundedBytes; + + public BytesResult(String value, String units, long roundedBytes) { + this.value = value; + this.units = units; + this.roundedBytes = roundedBytes; + } + } + /** * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc * * @param context Context to use to load the localized units - * @param number size value to be formatted + * @param sizeBytes size value to be formatted, in bytes * @return formatted string with the number */ - public static String formatFileSize(Context context, long number) { - return formatFileSize(context, number, false); + public static String formatFileSize(Context context, long sizeBytes) { + final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0); + return context.getString(com.android.internal.R.string.fileSizeSuffix, + res.value, res.units); } /** * Like {@link #formatFileSize}, but trying to generate shorter numbers * (showing fewer digits of precision). */ - public static String formatShortFileSize(Context context, long number) { - return formatFileSize(context, number, true); + public static String formatShortFileSize(Context context, long sizeBytes) { + final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER); + return context.getString(com.android.internal.R.string.fileSizeSuffix, + res.value, res.units); } - private static String formatFileSize(Context context, long number, boolean shorter) { - if (context == null) { - return ""; - } - - float result = number; + /** {@hide} */ + public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) { + float result = sizeBytes; int suffix = com.android.internal.R.string.byteShort; + long mult = 1; if (result > 900) { suffix = com.android.internal.R.string.kilobyteShort; + mult = TrafficStats.KB_IN_BYTES; result = result / 1024; } if (result > 900) { suffix = com.android.internal.R.string.megabyteShort; + mult = TrafficStats.MB_IN_BYTES; result = result / 1024; } if (result > 900) { suffix = com.android.internal.R.string.gigabyteShort; + mult = TrafficStats.GB_IN_BYTES; result = result / 1024; } if (result > 900) { suffix = com.android.internal.R.string.terabyteShort; + mult = TrafficStats.TB_IN_BYTES; result = result / 1024; } if (result > 900) { suffix = com.android.internal.R.string.petabyteShort; + mult = TrafficStats.PB_IN_BYTES; result = result / 1024; } String value; if (result < 1) { value = String.format("%.2f", result); } else if (result < 10) { - if (shorter) { + if ((flags & FLAG_SHORTER) != 0) { value = String.format("%.1f", result); } else { value = String.format("%.2f", result); } } else if (result < 100) { - if (shorter) { + if ((flags & FLAG_SHORTER) != 0) { value = String.format("%.0f", result); } else { value = String.format("%.2f", result); @@ -89,9 +116,14 @@ public final class Formatter { } else { value = String.format("%.0f", result); } - return context.getResources(). - getString(com.android.internal.R.string.fileSizeSuffix, - value, context.getString(suffix)); + final String units = res.getString(suffix); + final long roundedBytes; + if ((flags & FLAG_CALCULATE_ROUNDED) != 0) { + roundedBytes = (long) (Double.parseDouble(value) * mult); + } else { + roundedBytes = 0; + } + return new BytesResult(value, units, roundedBytes); } /** diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java index c40f11f..93a156b 100644 --- a/core/java/android/text/style/TtsSpan.java +++ b/core/java/android/text/style/TtsSpan.java @@ -165,7 +165,7 @@ public class TtsSpan implements ParcelableSpan { /** * The text associated with this span is a series of characters that have to - * be read verbatim. The engine will attempt to ready out any character like + * be read verbatim. The engine will attempt to read out any character like * punctuation but excluding whitespace. {@link #ARG_VERBATIM} is required. * Also accepts the arguments {@link #ARG_GENDER}, * {@link #ARG_ANIMACY}, {@link #ARG_MULTIPLICITY} and {@link #ARG_CASE}. diff --git a/core/java/android/transition/Explode.java b/core/java/android/transition/Explode.java index 788676a..3445ef2 100644 --- a/core/java/android/transition/Explode.java +++ b/core/java/android/transition/Explode.java @@ -90,7 +90,7 @@ public class Explode extends Visibility { float startY = endY + mTempLoc[1]; return TranslationAnimationCreator.createAnimation(view, endValues, bounds.left, bounds.top, - startX, startY, endX, endY, sDecelerate); + startX, startY, endX, endY, sDecelerate, this); } @Override @@ -119,7 +119,7 @@ public class Explode extends Visibility { endY += mTempLoc[1]; return TranslationAnimationCreator.createAnimation(view, startValues, - viewPosX, viewPosY, startX, startY, endX, endY, sAccelerate); + viewPosX, viewPosY, startX, startY, endX, endY, sAccelerate, this); } private void calculateOut(View sceneRoot, Rect bounds, int[] outVector) { diff --git a/core/java/android/transition/Slide.java b/core/java/android/transition/Slide.java index be1d907..9063b43 100644 --- a/core/java/android/transition/Slide.java +++ b/core/java/android/transition/Slide.java @@ -231,7 +231,7 @@ public class Slide extends Visibility { float startY = mSlideCalculator.getGoneY(sceneRoot, view); return TranslationAnimationCreator .createAnimation(view, endValues, position[0], position[1], - startX, startY, endX, endY, sDecelerate); + startX, startY, endX, endY, sDecelerate, this); } @Override @@ -247,6 +247,6 @@ public class Slide extends Visibility { float endY = mSlideCalculator.getGoneY(sceneRoot, view); return TranslationAnimationCreator .createAnimation(view, startValues, position[0], position[1], - startX, startY, endX, endY, sAccelerate); + startX, startY, endX, endY, sAccelerate, this); } } diff --git a/core/java/android/transition/TranslationAnimationCreator.java b/core/java/android/transition/TranslationAnimationCreator.java index de71fd7..1554975 100644 --- a/core/java/android/transition/TranslationAnimationCreator.java +++ b/core/java/android/transition/TranslationAnimationCreator.java @@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.graphics.Path; +import android.transition.Transition.TransitionListener; import android.view.View; /** @@ -48,7 +49,8 @@ class TranslationAnimationCreator { * a previous interruption, in which case it moves from the current position to (endX, endY). */ static Animator createAnimation(View view, TransitionValues values, int viewPosX, int viewPosY, - float startX, float startY, float endX, float endY, TimeInterpolator interpolator) { + float startX, float startY, float endX, float endY, TimeInterpolator interpolator, + Transition transition) { float terminalX = view.getTranslationX(); float terminalY = view.getTranslationY(); int[] startPosition = (int[]) values.view.getTag(R.id.transitionPosition); @@ -73,13 +75,15 @@ class TranslationAnimationCreator { TransitionPositionListener listener = new TransitionPositionListener(view, values.view, startPosX, startPosY, terminalX, terminalY); + transition.addListener(listener); anim.addListener(listener); anim.addPauseListener(listener); anim.setInterpolator(interpolator); return anim; } - private static class TransitionPositionListener extends AnimatorListenerAdapter { + private static class TransitionPositionListener extends AnimatorListenerAdapter implements + TransitionListener { private final View mViewInHierarchy; private final View mMovingView; @@ -117,8 +121,6 @@ class TranslationAnimationCreator { @Override public void onAnimationEnd(Animator animator) { - mMovingView.setTranslationX(mTerminalX); - mMovingView.setTranslationY(mTerminalY); } @Override @@ -134,6 +136,28 @@ class TranslationAnimationCreator { mMovingView.setTranslationX(mPausedX); mMovingView.setTranslationY(mPausedY); } + + @Override + public void onTransitionStart(Transition transition) { + } + + @Override + public void onTransitionEnd(Transition transition) { + mMovingView.setTranslationX(mTerminalX); + mMovingView.setTranslationY(mTerminalY); + } + + @Override + public void onTransitionCancel(Transition transition) { + } + + @Override + public void onTransitionPause(Transition transition) { + } + + @Override + public void onTransitionResume(Transition transition) { + } } } diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index bac668a..8b74a1e 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -557,7 +557,7 @@ public abstract class Visibility extends Transition { if (mIsForcedVisibility) { mView.setTransitionAlpha(0); } else { - mView.setTransitionVisibility(mFinalVisibility); + mView.setVisibility(mFinalVisibility); } } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0df8ea9..fd3ee4f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -56,6 +56,8 @@ import android.graphics.Shader; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManagerGlobal; +import android.os.Build; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -95,6 +97,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; import android.widget.Checkable; +import android.widget.FrameLayout; import android.widget.ScrollBarDrawable; import static android.os.Build.VERSION_CODES.*; @@ -4274,23 +4277,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback, PROVIDER_BACKGROUND)); break; case R.styleable.View_foreground: - setForeground(a.getDrawable(attr)); + if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + setForeground(a.getDrawable(attr)); + } break; case R.styleable.View_foregroundGravity: - setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY)); + if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY)); + } break; case R.styleable.View_foregroundTintMode: - setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null)); + if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null)); + } break; case R.styleable.View_foregroundTint: - setForegroundTintList(a.getColorStateList(attr)); + if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + setForegroundTintList(a.getColorStateList(attr)); + } break; case R.styleable.View_foregroundInsidePadding: - if (mForegroundInfo == null) { - mForegroundInfo = new ForegroundInfo(); + if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) { + if (mForegroundInfo == null) { + mForegroundInfo = new ForegroundInfo(); + } + mForegroundInfo.mInsidePadding = a.getBoolean(attr, + mForegroundInfo.mInsidePadding); } - mForegroundInfo.mInsidePadding = a.getBoolean(attr, - mForegroundInfo.mInsidePadding); break; case R.styleable.View_scrollIndicators: final int scrollIndicators = diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 89743e5..73cfd8c 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2939,11 +2939,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } - /** @hide */ @Override - public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) { - super.onInitializeAccessibilityEventInternal(event); - event.setClassName(ViewGroup.class.getName()); + public CharSequence getAccessibilityClassName() { + return ViewGroup.class.getName(); } @Override diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java index bd45007..f18b7ac 100644 --- a/core/java/android/view/ViewPropertyAnimator.java +++ b/core/java/android/view/ViewPropertyAnimator.java @@ -80,12 +80,18 @@ public class ViewPropertyAnimator { /** * The interpolator of the underlying Animator object. By default, we don't set the interpolator - * on the Animator and just use its default interpolator. If the interpolator is set to a - * non-null value on this Animator, then we use the interpolator that it was set to. + * on the Animator and just use its default interpolator. If the interpolator is ever set on + * this Animator, then we use the interpolator that it was set to. */ private TimeInterpolator mInterpolator; /** + * A flag indicating whether the interpolator has been set on this object. If not, we don't set + * the interpolator on the underlying Animator, but instead just use its default interpolator. + */ + private boolean mInterpolatorSet = false; + + /** * Listener for the lifecycle events of the underlying ValueAnimator object. */ private Animator.AnimatorListener mListener = null; @@ -332,6 +338,7 @@ public class ViewPropertyAnimator { * @return This object, allowing calls to methods in this class to be chained. */ public ViewPropertyAnimator setInterpolator(TimeInterpolator interpolator) { + mInterpolatorSet = true; mInterpolator = interpolator; return this; } @@ -342,7 +349,7 @@ public class ViewPropertyAnimator { * @return The timing interpolator for this animation. */ public TimeInterpolator getInterpolator() { - if (mInterpolator != null) { + if (mInterpolatorSet) { return mInterpolator; } else { // Just return the default from ValueAnimator, since that's what we'd get if @@ -890,7 +897,7 @@ public class ViewPropertyAnimator { if (mDurationSet) { animator.setDuration(mDuration); } - if (mInterpolator != null) { + if (mInterpolatorSet) { animator.setInterpolator(mInterpolator); } animator.start(); diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java index 195a335..e77dc0d 100644 --- a/core/java/android/view/textservice/SpellCheckerSession.java +++ b/core/java/android/view/textservice/SpellCheckerSession.java @@ -28,9 +28,6 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.util.Log; -import android.view.textservice.SpellCheckerInfo; -import android.view.textservice.SuggestionsInfo; -import android.view.textservice.TextInfo; import java.util.LinkedList; import java.util.Queue; @@ -226,17 +223,44 @@ public class SpellCheckerSession { private static final int TASK_GET_SUGGESTIONS_MULTIPLE = 2; private static final int TASK_CLOSE = 3; private static final int TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE = 4; - private final Queue<SpellCheckerParams> mPendingTasks = - new LinkedList<SpellCheckerParams>(); + private static String taskToString(int task) { + switch (task) { + case TASK_CANCEL: + return "TASK_CANCEL"; + case TASK_GET_SUGGESTIONS_MULTIPLE: + return "TASK_GET_SUGGESTIONS_MULTIPLE"; + case TASK_CLOSE: + return "TASK_CLOSE"; + case TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE: + return "TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE"; + default: + return "Unexpected task=" + task; + } + } + + private final Queue<SpellCheckerParams> mPendingTasks = new LinkedList<>(); private Handler mHandler; - private boolean mOpened; + private static final int STATE_WAIT_CONNECTION = 0; + private static final int STATE_CONNECTED = 1; + private static final int STATE_CLOSED_AFTER_CONNECTION = 2; + private static final int STATE_CLOSED_BEFORE_CONNECTION = 3; + private static String stateToString(int state) { + switch (state) { + case STATE_WAIT_CONNECTION: return "STATE_WAIT_CONNECTION"; + case STATE_CONNECTED: return "STATE_CONNECTED"; + case STATE_CLOSED_AFTER_CONNECTION: return "STATE_CLOSED_AFTER_CONNECTION"; + case STATE_CLOSED_BEFORE_CONNECTION: return "STATE_CLOSED_BEFORE_CONNECTION"; + default: return "Unexpected state=" + state; + } + } + private int mState = STATE_WAIT_CONNECTION; + private ISpellCheckerSession mISpellCheckerSession; private HandlerThread mThread; private Handler mAsyncHandler; public SpellCheckerSessionListenerImpl(Handler handler) { - mOpened = false; mHandler = handler; } @@ -257,12 +281,18 @@ public class SpellCheckerSession { private void processTask(ISpellCheckerSession session, SpellCheckerParams scp, boolean async) { + if (DBG) { + synchronized (this) { + Log.d(TAG, "entering processTask:" + + " session.hashCode()=#" + Integer.toHexString(session.hashCode()) + + " scp.mWhat=" + taskToString(scp.mWhat) + " async=" + async + + " mAsyncHandler=" + mAsyncHandler + + " mState=" + stateToString(mState)); + } + } if (async || mAsyncHandler == null) { switch (scp.mWhat) { case TASK_CANCEL: - if (DBG) { - Log.w(TAG, "Cancel spell checker tasks."); - } try { session.onCancel(); } catch (RemoteException e) { @@ -270,9 +300,6 @@ public class SpellCheckerSession { } break; case TASK_GET_SUGGESTIONS_MULTIPLE: - if (DBG) { - Log.w(TAG, "Get suggestions from the spell checker."); - } try { session.onGetSuggestionsMultiple(scp.mTextInfos, scp.mSuggestionsLimit, scp.mSequentialWords); @@ -281,9 +308,6 @@ public class SpellCheckerSession { } break; case TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE: - if (DBG) { - Log.w(TAG, "Get sentence suggestions from the spell checker."); - } try { session.onGetSentenceSuggestionsMultiple( scp.mTextInfos, scp.mSuggestionsLimit); @@ -292,9 +316,6 @@ public class SpellCheckerSession { } break; case TASK_CLOSE: - if (DBG) { - Log.w(TAG, "Close spell checker tasks."); - } try { session.onClose(); } catch (RemoteException e) { @@ -313,21 +334,62 @@ public class SpellCheckerSession { // If we are closing, we want to clean up our state now even // if it is pending as an async operation. synchronized (this) { - mISpellCheckerSession = null; - mHandler = null; - if (mThread != null) { - mThread.quit(); - } - mThread = null; - mAsyncHandler = null; + processCloseLocked(); } } } + private void processCloseLocked() { + if (DBG) Log.d(TAG, "entering processCloseLocked:" + + " session" + (mISpellCheckerSession != null ? ".hashCode()=#" + + Integer.toHexString(mISpellCheckerSession.hashCode()) : "=null") + + " mState=" + stateToString(mState)); + mISpellCheckerSession = null; + if (mThread != null) { + mThread.quit(); + } + mHandler = null; + mPendingTasks.clear(); + mThread = null; + mAsyncHandler = null; + switch (mState) { + case STATE_WAIT_CONNECTION: + mState = STATE_CLOSED_BEFORE_CONNECTION; + break; + case STATE_CONNECTED: + mState = STATE_CLOSED_AFTER_CONNECTION; + break; + default: + Log.e(TAG, "processCloseLocked is called unexpectedly. mState=" + + stateToString(mState)); + break; + } + } + public synchronized void onServiceConnected(ISpellCheckerSession session) { synchronized (this) { + switch (mState) { + case STATE_WAIT_CONNECTION: + // OK, go ahead. + break; + case STATE_CLOSED_BEFORE_CONNECTION: + // This is possible, and not an error. The client no longer is interested + // in this connection. OK to ignore. + if (DBG) Log.i(TAG, "ignoring onServiceConnected since the session is" + + " already closed."); + return; + default: + Log.e(TAG, "ignoring onServiceConnected due to unexpected mState=" + + stateToString(mState)); + return; + } + if (session == null) { + Log.e(TAG, "ignoring onServiceConnected due to session=null"); + return; + } mISpellCheckerSession = session; if (session.asBinder() instanceof Binder && mThread == null) { + if (DBG) Log.d(TAG, "starting HandlerThread in onServiceConnected."); // If this is a local object, we need to do our own threading // to make sure we handle it asynchronously. mThread = new HandlerThread("SpellCheckerSession", @@ -340,62 +402,65 @@ public class SpellCheckerSession { } }; } - mOpened = true; + mState = STATE_CONNECTED; + if (DBG) { + Log.d(TAG, "processed onServiceConnected: mISpellCheckerSession.hashCode()=#" + + Integer.toHexString(mISpellCheckerSession.hashCode()) + + " mPendingTasks.size()=" + mPendingTasks.size()); + } } - if (DBG) - Log.d(TAG, "onServiceConnected - Success"); while (!mPendingTasks.isEmpty()) { processTask(session, mPendingTasks.poll(), false); } } public void cancel() { - if (DBG) { - Log.w(TAG, "cancel"); - } processOrEnqueueTask(new SpellCheckerParams(TASK_CANCEL, null, 0, false)); } public void getSuggestionsMultiple( TextInfo[] textInfos, int suggestionsLimit, boolean sequentialWords) { - if (DBG) { - Log.w(TAG, "getSuggestionsMultiple"); - } processOrEnqueueTask( new SpellCheckerParams(TASK_GET_SUGGESTIONS_MULTIPLE, textInfos, suggestionsLimit, sequentialWords)); } public void getSentenceSuggestionsMultiple(TextInfo[] textInfos, int suggestionsLimit) { - if (DBG) { - Log.w(TAG, "getSentenceSuggestionsMultiple"); - } processOrEnqueueTask( new SpellCheckerParams(TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE, textInfos, suggestionsLimit, false)); } public void close() { - if (DBG) { - Log.w(TAG, "close"); - } processOrEnqueueTask(new SpellCheckerParams(TASK_CLOSE, null, 0, false)); } public boolean isDisconnected() { - return mOpened && mISpellCheckerSession == null; + synchronized (this) { + return mState != STATE_CONNECTED; + } } private void processOrEnqueueTask(SpellCheckerParams scp) { - if (DBG) { - Log.d(TAG, "process or enqueue task: " + mISpellCheckerSession); - } ISpellCheckerSession session; synchronized (this) { - session = mISpellCheckerSession; - if (session == null) { + if (mState != STATE_WAIT_CONNECTION && mState != STATE_CONNECTED) { + Log.e(TAG, "ignoring processOrEnqueueTask due to unexpected mState=" + + taskToString(scp.mWhat) + + " scp.mWhat=" + taskToString(scp.mWhat)); + return; + } + + if (mState == STATE_WAIT_CONNECTION) { + // If we are still waiting for the connection. Need to pay special attention. + if (scp.mWhat == TASK_CLOSE) { + processCloseLocked(); + return; + } + // Enqueue the task to task queue. SpellCheckerParams closeTask = null; if (scp.mWhat == TASK_CANCEL) { + if (DBG) Log.d(TAG, "canceling pending tasks in processOrEnqueueTask."); while (!mPendingTasks.isEmpty()) { final SpellCheckerParams tmp = mPendingTasks.poll(); if (tmp.mWhat == TASK_CLOSE) { @@ -409,9 +474,15 @@ public class SpellCheckerSession { if (closeTask != null) { mPendingTasks.offer(closeTask); } + if (DBG) Log.d(TAG, "queueing tasks in processOrEnqueueTask since the" + + " connection is not established." + + " mPendingTasks.size()=" + mPendingTasks.size()); return; } + + session = mISpellCheckerSession; } + // session must never be null here. processTask(session, scp, false); } @@ -467,9 +538,6 @@ public class SpellCheckerSession { @Override public void onServiceConnected(ISpellCheckerSession session) { - if (DBG) { - Log.w(TAG, "SpellCheckerSession connected."); - } mParentSpellCheckerSessionListenerImpl.onServiceConnected(session); } } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 0001860..6454b57 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -6575,13 +6575,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te * @return A view from the ScrapViews collection. These are unordered. */ View getScrapView(int position) { + final int whichScrap = mAdapter.getItemViewType(position); + if (whichScrap < 0) { + return null; + } if (mViewTypeCount == 1) { return retrieveFromScrap(mCurrentScrap, position); - } else { - final int whichScrap = mAdapter.getItemViewType(position); - if (whichScrap >= 0 && whichScrap < mScrapViews.length) { - return retrieveFromScrap(mScrapViews[whichScrap], position); - } + } else if (whichScrap < mScrapViews.length) { + return retrieveFromScrap(mScrapViews[whichScrap], position); } return null; } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index cf6a018..bde8dcf 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -122,6 +122,7 @@ public class Editor { static final int BLINK = 500; private static final float[] TEMP_POSITION = new float[2]; private static int DRAG_SHADOW_MAX_TEXT_LENGTH = 20; + private static final float LINE_SLOP_MULTIPLIER_FOR_HANDLEVIEWS = 0.5f; // Tag used when the Editor maintains its own separate UndoManager. private static final String UNDO_OWNER_TAG = "Editor"; @@ -244,15 +245,6 @@ public class Editor { final CursorAnchorInfoNotifier mCursorAnchorInfoNotifier = new CursorAnchorInfoNotifier(); - private final Runnable mHideFloatingToolbar = new Runnable() { - @Override - public void run() { - if (mTextActionMode != null) { - mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); - } - } - }; - private final Runnable mShowFloatingToolbar = new Runnable() { @Override public void run() { @@ -389,7 +381,6 @@ public class Editor { mTextView.removeCallbacks(mInsertionActionModeRunnable); } - mTextView.removeCallbacks(mHideFloatingToolbar); mTextView.removeCallbacks(mShowFloatingToolbar); destroyDisplayListsData(); @@ -1248,14 +1239,12 @@ public class Editor { private void hideFloatingToolbar() { if (mTextActionMode != null) { mTextView.removeCallbacks(mShowFloatingToolbar); - // Delay the "hide" a little bit just in case a "show" will happen almost immediately. - mTextView.postDelayed(mHideFloatingToolbar, 100); + mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); } } private void showFloatingToolbar() { if (mTextActionMode != null) { - mTextView.removeCallbacks(mHideFloatingToolbar); // Delay "show" so it doesn't interfere with click confirmations // or double-clicks that could "dismiss" the floating toolbar. int delay = ViewConfiguration.getDoubleTapTimeout(); @@ -4024,7 +4013,15 @@ public class Editor { @Override public void updatePosition(float x, float y) { - positionAtCursorOffset(mTextView.getOffsetForPosition(x, y), false); + Layout layout = mTextView.getLayout(); + int offset; + if (layout != null) { + int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y); + offset = mTextView.getOffsetAtCoordinate(currLine, x); + } else { + offset = mTextView.getOffsetForPosition(x, y); + } + positionAtCursorOffset(offset, false); if (mTextActionMode != null) { mTextActionMode.invalidate(); } @@ -4084,16 +4081,23 @@ public class Editor { @Override public void updatePosition(float x, float y) { - final int selectionEnd = mTextView.getSelectionEnd(); final Layout layout = mTextView.getLayout(); - int initialOffset = mTextView.getOffsetForPosition(x, y); - int currLine = mTextView.getLineAtCoordinate(y); + if (layout == null) { + // HandleView will deal appropriately in positionAtCursorOffset when + // layout is null. + positionAtCursorOffset(mTextView.getOffsetForPosition(x, y), false); + return; + } + boolean positionCursor = false; + final int selectionEnd = mTextView.getSelectionEnd(); + int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y); + int initialOffset = mTextView.getOffsetAtCoordinate(currLine, x); if (initialOffset >= selectionEnd) { // Handles have crossed, bound it to the last selected line and // adjust by word / char as normal. - currLine = layout != null ? layout.getLineForOffset(selectionEnd) : mPrevLine; + currLine = layout.getLineForOffset(selectionEnd); initialOffset = mTextView.getOffsetAtCoordinate(currLine, x); } @@ -4211,16 +4215,23 @@ public class Editor { @Override public void updatePosition(float x, float y) { - final int selectionStart = mTextView.getSelectionStart(); final Layout layout = mTextView.getLayout(); - int initialOffset = mTextView.getOffsetForPosition(x, y); - int currLine = mTextView.getLineAtCoordinate(y); + if (layout == null) { + // HandleView will deal appropriately in positionAtCursorOffset when + // layout is null. + positionAtCursorOffset(mTextView.getOffsetForPosition(x, y), false); + return; + } + boolean positionCursor = false; + final int selectionStart = mTextView.getSelectionStart(); + int currLine = getCurrentLineAdjustedForSlop(layout, mPrevLine, y); + int initialOffset = mTextView.getOffsetAtCoordinate(currLine, x); if (initialOffset <= selectionStart) { // Handles have crossed, bound it to the first selected line and // adjust by word / char as normal. - currLine = layout != null ? layout.getLineForOffset(selectionStart) : mPrevLine; + currLine = layout.getLineForOffset(selectionStart); initialOffset = mTextView.getOffsetAtCoordinate(currLine, x); } @@ -4240,7 +4251,7 @@ public class Editor { offset = mPreviousOffset; } } - if (layout != null && offset > initialOffset) { + if (offset > initialOffset) { final float adjustedX = layout.getPrimaryHorizontal(offset); mTouchWordDelta = adjustedX - mTextView.convertToLocalHorizontalCoordinate(x); @@ -4256,7 +4267,7 @@ public class Editor { if (currLine < mPrevLine) { // We're on a different line, so we'll snap to word boundaries. offset = end; - if (layout != null && offset > initialOffset) { + if (offset > initialOffset) { final float adjustedX = layout.getPrimaryHorizontal(offset); mTouchWordDelta = adjustedX - mTextView.convertToLocalHorizontalCoordinate(x); @@ -4297,6 +4308,37 @@ public class Editor { } } + private int getCurrentLineAdjustedForSlop(Layout layout, int prevLine, float y) { + if (layout == null || prevLine > layout.getLineCount() + || layout.getLineCount() <= 0 || prevLine < 0) { + // Invalid parameters, just return whatever line is at y. + return mTextView.getLineAtCoordinate(y); + } + + final float verticalOffset = mTextView.viewportToContentVerticalOffset(); + final int lineCount = layout.getLineCount(); + final float slop = mTextView.getLineHeight() * LINE_SLOP_MULTIPLIER_FOR_HANDLEVIEWS; + + final float firstLineTop = layout.getLineTop(0) + verticalOffset; + final float prevLineTop = layout.getLineTop(prevLine) + verticalOffset; + final float yTopBound = Math.max(prevLineTop - slop, firstLineTop + slop); + + final float lastLineBottom = layout.getLineBottom(lineCount - 1) + verticalOffset; + final float prevLineBottom = layout.getLineBottom(prevLine) + verticalOffset; + final float yBottomBound = Math.min(prevLineBottom + slop, lastLineBottom - slop); + + // Determine if we've moved lines based on y position and previous line. + int currLine; + if (y <= yTopBound) { + currLine = Math.max(prevLine - 1, 0); + } else if (y >= yBottomBound) { + currLine = Math.min(prevLine + 1, lineCount - 1); + } else { + currLine = prevLine; + } + return currLine; + } + /** * A CursorController instance can be used to control a cursor in the text. */ @@ -4379,6 +4421,10 @@ public class Editor { // Indicates whether the user is selecting text and using the drag accelerator. private boolean mDragAcceleratorActive; private boolean mHaventMovedEnoughToStartDrag; + // The line that a selection happened most recently with the drag accelerator. + private int mLineSelectionIsOn = -1; + // Whether the drag accelerator has selected past the initial line. + private boolean mSwitchedLines = false; SelectionModifierCursorController() { resetTouchOffsets(); @@ -4431,6 +4477,7 @@ public class Editor { // Start location of selection. mStartOffset = mTextView.getOffsetForPosition(mLastDownPositionX, mLastDownPositionY); + mLineSelectionIsOn = mTextView.getLineAtCoordinate(mLastDownPositionY); // Don't show the handles until user has lifted finger. hide(); @@ -4514,17 +4561,35 @@ public class Editor { break; } - if (mStartOffset != -1) { + if (mStartOffset != -1 && mTextView.getLayout() != null) { if (!mHaventMovedEnoughToStartDrag) { - // Offset the finger by the same vertical offset as the handles. This - // improves visibility of the content being selected by shifting - // the finger below the content. - final float fingerOffset = (mStartHandle != null) - ? mStartHandle.getIdealVerticalOffset() - : touchSlop; - int offset = - mTextView.getOffsetForPosition(eventX, eventY - fingerOffset); + + float y = eventY; + if (mSwitchedLines) { + // Offset the finger by the same vertical offset as the handles. + // This improves visibility of the content being selected by + // shifting the finger below the content, this is applied once + // the user has switched lines. + final float fingerOffset = (mStartHandle != null) + ? mStartHandle.getIdealVerticalOffset() + : touchSlop; + y = eventY - fingerOffset; + } + + final int currLine = getCurrentLineAdjustedForSlop( + mTextView.getLayout(), + mLineSelectionIsOn, y); + if (!mSwitchedLines && currLine != mLineSelectionIsOn) { + // Break early here, we want to offset the finger position from + // the selection highlight, once the user moved their finger + // to a different line we should apply the offset and *not* switch + // lines until recomputing the position with the finger offset. + mSwitchedLines = true; + break; + } + int startOffset; + int offset = mTextView.getOffsetAtCoordinate(currLine, eventX); // Snap to word boundaries. if (mStartOffset < offset) { // Expanding with end handle. @@ -4535,6 +4600,7 @@ public class Editor { offset = getWordStart(offset); startOffset = getWordEnd(mStartOffset); } + mLineSelectionIsOn = currLine; Selection.setSelection((Spannable) mTextView.getText(), startOffset, offset); } @@ -4571,6 +4637,7 @@ public class Editor { startSelectionActionMode(); mDragAcceleratorActive = false; mStartOffset = -1; + mSwitchedLines = false; } break; } @@ -4600,6 +4667,7 @@ public class Editor { mMinTouchOffset = mMaxTouchOffset = -1; mStartOffset = -1; mDragAcceleratorActive = false; + mSwitchedLines = false; } /** diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 6b28f89..e0b2395 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -216,7 +216,7 @@ public class ImageView extends View { protected boolean verifyDrawable(Drawable dr) { return mDrawable == dr || super.verifyDrawable(dr); } - + @Override public void jumpDrawablesToCurrentState() { super.jumpDrawablesToCurrentState(); @@ -226,6 +226,15 @@ public class ImageView extends View { @Override public void invalidateDrawable(Drawable dr) { if (dr == mDrawable) { + if (dr != null) { + // update cached drawable dimensions if they've changed + final int w = dr.getIntrinsicWidth(); + final int h = dr.getIntrinsicHeight(); + if (w != mDrawableWidth || h != mDrawableHeight) { + mDrawableWidth = w; + mDrawableHeight = h; + } + } /* we invalidate the whole view in this case because it's very * hard to know where the drawable actually is. This is made * complicated because of the offsets and transformations that diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index affc5da..339038e 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -522,7 +522,7 @@ public class RelativeLayout extends ViewGroup { View baselineView = null; LayoutParams baselineParams = null; for (int i = 0; i < count; i++) { - final View child = getChildAt(i); + final View child = views[i]; if (child.getVisibility() != GONE) { final LayoutParams childParams = (LayoutParams) child.getLayoutParams(); if (baselineView == null || baselineParams == null @@ -548,9 +548,9 @@ public class RelativeLayout extends ViewGroup { if (offsetHorizontalAxis) { for (int i = 0; i < count; i++) { - View child = getChildAt(i); + final View child = views[i]; if (child.getVisibility() != GONE) { - LayoutParams params = (LayoutParams) child.getLayoutParams(); + final LayoutParams params = (LayoutParams) child.getLayoutParams(); final int[] rules = params.getRules(layoutDirection); if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) { centerHorizontal(child, params, width); @@ -578,9 +578,9 @@ public class RelativeLayout extends ViewGroup { if (offsetVerticalAxis) { for (int i = 0; i < count; i++) { - View child = getChildAt(i); + final View child = views[i]; if (child.getVisibility() != GONE) { - LayoutParams params = (LayoutParams) child.getLayoutParams(); + final LayoutParams params = (LayoutParams) child.getLayoutParams(); final int[] rules = params.getRules(layoutDirection); if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_VERTICAL] != 0) { centerVertical(child, params, height); @@ -607,9 +607,9 @@ public class RelativeLayout extends ViewGroup { final int verticalOffset = contentBounds.top - top; if (horizontalOffset != 0 || verticalOffset != 0) { for (int i = 0; i < count; i++) { - View child = getChildAt(i); + final View child = views[i]; if (child.getVisibility() != GONE && child != ignore) { - LayoutParams params = (LayoutParams) child.getLayoutParams(); + final LayoutParams params = (LayoutParams) child.getLayoutParams(); if (horizontalGravity) { params.mLeft += horizontalOffset; params.mRight += horizontalOffset; @@ -626,9 +626,9 @@ public class RelativeLayout extends ViewGroup { if (isLayoutRtl()) { final int offsetWidth = myWidth - width; for (int i = 0; i < count; i++) { - View child = getChildAt(i); + final View child = views[i]; if (child.getVisibility() != GONE) { - LayoutParams params = (LayoutParams) child.getLayoutParams(); + final LayoutParams params = (LayoutParams) child.getLayoutParams(); params.mLeft -= offsetWidth; params.mRight -= offsetWidth; } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 78b5d5d..c538dc2 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -241,8 +241,6 @@ import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; * @attr ref android.R.styleable#TextView_fontFeatureSettings * @attr ref android.R.styleable#TextView_breakStrategy * @attr ref android.R.styleable#TextView_hyphenationFrequency - * @attr ref android.R.styleable#TextView_leftIndents - * @attr ref android.R.styleable#TextView_rightIndents */ @RemoteView public class TextView extends View implements ViewTreeObserver.OnPreDrawListener { @@ -559,8 +557,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private int mBreakStrategy; private int mHyphenationFrequency; - private int[] mLeftIndents; - private int[] mRightIndents; private int mMaximum = Integer.MAX_VALUE; private int mMaxMode = LINES; @@ -1165,16 +1161,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener case com.android.internal.R.styleable.TextView_hyphenationFrequency: mHyphenationFrequency = a.getInt(attr, Layout.HYPHENATION_FREQUENCY_NONE); break; - - case com.android.internal.R.styleable.TextView_leftIndents: - TypedArray margins = res.obtainTypedArray(a.getResourceId(attr, View.NO_ID)); - mLeftIndents = parseDimensionArray(margins); - break; - - case com.android.internal.R.styleable.TextView_rightIndents: - margins = res.obtainTypedArray(a.getResourceId(attr, View.NO_ID)); - mRightIndents = parseDimensionArray(margins); - break; } } a.recycle(); @@ -3095,51 +3081,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Set indents. Arguments are arrays holding an indent amount, one per line, measured in - * pixels. For lines past the last element in the array, the last element repeats. - * - * @param leftIndents array of indent values for left margin, in pixels - * @param rightIndents array of indent values for right margin, in pixels - * - * @see #getLeftIndents() - * @see #getRightIndents() - * - * @attr ref android.R.styleable#TextView_leftIndents - * @attr ref android.R.styleable#TextView_rightIndents - */ - public void setIndents(@Nullable int[] leftIndents, @Nullable int[] rightIndents) { - mLeftIndents = leftIndents; - mRightIndents = rightIndents; - if (mLayout != null) { - nullLayouts(); - requestLayout(); - invalidate(); - } - } - - /** - * Get left indents. See {#link setMargins} for more details. - * - * @return left indents - * @see #setIndents(int[], int[]) - * @attr ref android.R.styleable#TextView_leftIndents - */ - public int[] getLeftIndents() { - return mLeftIndents; - } - - /** - * Get right indents. See {#link setMargins} for more details. - * - * @return right indents - * @see #setIndents(int[], int[]) - * @attr ref android.R.styleable#TextView_rightIndents - */ - public int[] getRightIndents() { - return mRightIndents; - } - - /** * Sets font feature settings. The format is the same as the CSS * font-feature-settings attribute: * http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings @@ -6685,9 +6626,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setIncludePad(mIncludePad) .setBreakStrategy(mBreakStrategy) .setHyphenationFrequency(mHyphenationFrequency); - if (mLeftIndents != null || mRightIndents != null) { - builder.setIndents(mLeftIndents, mRightIndents); - } if (shouldEllipsize) { builder.setEllipsize(mEllipsize) .setEllipsizedWidth(ellipsisWidth) @@ -6776,9 +6714,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener .setIncludePad(mIncludePad) .setBreakStrategy(mBreakStrategy) .setHyphenationFrequency(mHyphenationFrequency); - if (mLeftIndents != null || mRightIndents != null) { - builder.setIndents(mLeftIndents, mRightIndents); - } if (shouldEllipsize) { builder.setEllipsize(effectiveEllipsize) .setEllipsizedWidth(ellipsisWidth) diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java index 8ace0f3..471ea9b 100644 --- a/core/java/android/widget/Toolbar.java +++ b/core/java/android/widget/Toolbar.java @@ -26,7 +26,6 @@ import android.annotation.StyleRes; import android.app.ActionBar; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; @@ -148,6 +147,9 @@ public class Toolbar extends ViewGroup { // Clear me after use. private final ArrayList<View> mTempViews = new ArrayList<View>(); + // Used to hold views that will be removed while we have an expanded action view. + private final ArrayList<View> mHiddenViews = new ArrayList<>(); + private final int[] mTempMargins = new int[2]; private OnMenuItemClickListener mOnMenuItemClickListener; @@ -271,6 +273,24 @@ public class Toolbar extends ViewGroup { if (!TextUtils.isEmpty(navDesc)) { setNavigationContentDescription(navDesc); } + + final Drawable logo = a.getDrawable(R.styleable.Toolbar_logo); + if (logo != null) { + setLogo(logo); + } + + final CharSequence logoDesc = a.getText(R.styleable.Toolbar_logoDescription); + if (!TextUtils.isEmpty(logoDesc)) { + setLogoDescription(logoDesc); + } + + if (a.hasValue(R.styleable.Toolbar_titleTextColor)) { + setTitleTextColor(a.getColor(R.styleable.Toolbar_titleTextColor, 0xffffffff)); + } + + if (a.hasValue(R.styleable.Toolbar_subtitleTextColor)) { + setSubtitleTextColor(a.getColor(R.styleable.Toolbar_subtitleTextColor, 0xffffffff)); + } a.recycle(); } @@ -435,12 +455,12 @@ public class Toolbar extends ViewGroup { public void setLogo(Drawable drawable) { if (drawable != null) { ensureLogoView(); - if (mLogoView.getParent() == null) { - addSystemView(mLogoView); - updateChildVisibilityForExpandedActionView(mLogoView); + if (!isChildOrHidden(mLogoView)) { + addSystemView(mLogoView, true); } - } else if (mLogoView != null && mLogoView.getParent() != null) { + } else if (mLogoView != null && isChildOrHidden(mLogoView)) { removeView(mLogoView); + mHiddenViews.remove(mLogoView); } if (mLogoView != null) { mLogoView.setImageDrawable(drawable); @@ -577,12 +597,12 @@ public class Toolbar extends ViewGroup { mTitleTextView.setTextColor(mTitleTextColor); } } - if (mTitleTextView.getParent() == null) { - addSystemView(mTitleTextView); - updateChildVisibilityForExpandedActionView(mTitleTextView); + if (!isChildOrHidden(mTitleTextView)) { + addSystemView(mTitleTextView, true); } - } else if (mTitleTextView != null && mTitleTextView.getParent() != null) { + } else if (mTitleTextView != null && isChildOrHidden(mTitleTextView)) { removeView(mTitleTextView); + mHiddenViews.remove(mTitleTextView); } if (mTitleTextView != null) { mTitleTextView.setText(title); @@ -631,12 +651,12 @@ public class Toolbar extends ViewGroup { mSubtitleTextView.setTextColor(mSubtitleTextColor); } } - if (mSubtitleTextView.getParent() == null) { - addSystemView(mSubtitleTextView); - updateChildVisibilityForExpandedActionView(mSubtitleTextView); + if (!isChildOrHidden(mSubtitleTextView)) { + addSystemView(mSubtitleTextView, true); } - } else if (mSubtitleTextView != null && mSubtitleTextView.getParent() != null) { + } else if (mSubtitleTextView != null && isChildOrHidden(mSubtitleTextView)) { removeView(mSubtitleTextView); + mHiddenViews.remove(mSubtitleTextView); } if (mSubtitleTextView != null) { mSubtitleTextView.setText(subtitle); @@ -772,12 +792,12 @@ public class Toolbar extends ViewGroup { public void setNavigationIcon(@Nullable Drawable icon) { if (icon != null) { ensureNavButtonView(); - if (mNavButtonView.getParent() == null) { - addSystemView(mNavButtonView); - updateChildVisibilityForExpandedActionView(mNavButtonView); + if (!isChildOrHidden(mNavButtonView)) { + addSystemView(mNavButtonView, true); } - } else if (mNavButtonView != null && mNavButtonView.getParent() != null) { + } else if (mNavButtonView != null && isChildOrHidden(mNavButtonView)) { removeView(mNavButtonView); + mHiddenViews.remove(mNavButtonView); } if (mNavButtonView != null) { mNavButtonView.setImageDrawable(icon); @@ -866,7 +886,7 @@ public class Toolbar extends ViewGroup { final LayoutParams lp = generateDefaultLayoutParams(); lp.gravity = Gravity.END | (mButtonGravity & Gravity.VERTICAL_GRAVITY_MASK); mMenuView.setLayoutParams(lp); - addSystemView(mMenuView); + addSystemView(mMenuView, false); } } @@ -1041,7 +1061,7 @@ public class Toolbar extends ViewGroup { } } - private void addSystemView(View v) { + private void addSystemView(View v, boolean allowHide) { final ViewGroup.LayoutParams vlp = v.getLayoutParams(); final LayoutParams lp; if (vlp == null) { @@ -1052,7 +1072,13 @@ public class Toolbar extends ViewGroup { lp = (LayoutParams) vlp; } lp.mViewType = LayoutParams.SYSTEM; - addView(v, lp); + + if (allowHide && mExpandedActionView != null) { + v.setLayoutParams(lp); + mHiddenViews.add(v); + } else { + addView(v, lp); + } } @Override @@ -1741,22 +1767,30 @@ public class Toolbar extends ViewGroup { return mWrapper; } - private void setChildVisibilityForExpandedActionView(boolean expand) { + void removeChildrenForExpandedActionView() { final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { + // Go backwards since we're removing from the list + for (int i = childCount - 1; i >= 0; i--) { final View child = getChildAt(i); final LayoutParams lp = (LayoutParams) child.getLayoutParams(); if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { - child.setVisibility(expand ? GONE : VISIBLE); + removeViewAt(i); + mHiddenViews.add(child); } } } - private void updateChildVisibilityForExpandedActionView(View child) { - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (lp.mViewType != LayoutParams.EXPANDED && child != mMenuView) { - child.setVisibility(mExpandedActionView != null ? GONE : VISIBLE); + void addChildrenForExpandedActionView() { + final int count = mHiddenViews.size(); + // Re-add in reverse order since we removed in reverse order + for (int i = count - 1; i >= 0; i--) { + addView(mHiddenViews.get(i)); } + mHiddenViews.clear(); + } + + private boolean isChildOrHidden(View child) { + return child.getParent() == this || mHiddenViews.contains(child); } /** @@ -1971,7 +2005,7 @@ public class Toolbar extends ViewGroup { addView(mExpandedActionView); } - setChildVisibilityForExpandedActionView(true); + removeChildrenForExpandedActionView(); requestLayout(); item.setActionViewExpanded(true); @@ -1994,7 +2028,7 @@ public class Toolbar extends ViewGroup { removeView(mCollapseButtonView); mExpandedActionView = null; - setChildVisibilityForExpandedActionView(false); + addChildrenForExpandedActionView(); mCurrentExpandedItem = null; requestLayout(); item.setActionViewExpanded(false); diff --git a/core/java/com/android/internal/app/AssistUtils.java b/core/java/com/android/internal/app/AssistUtils.java new file mode 100644 index 0000000..b520384 --- /dev/null +++ b/core/java/com/android/internal/app/AssistUtils.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2015 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.app; + +import android.app.SearchManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.provider.Settings; +import android.util.Log; + +/** + * Utility method for dealing with the assistant aspects of + * {@link com.android.internal.app.IVoiceInteractionManagerService IVoiceInteractionManagerService}. + */ +public class AssistUtils { + + private static final String TAG = "AssistUtils"; + + private final Context mContext; + private final IVoiceInteractionManagerService mVoiceInteractionManagerService; + + public AssistUtils(Context context) { + mContext = context; + mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface( + ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); + } + + public void showSessionForActiveService(IVoiceInteractionSessionShowCallback showCallback) { + try { + mVoiceInteractionManagerService.showSessionForActiveService(showCallback); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call showSessionForActiveService", e); + } + } + + public void launchVoiceAssistFromKeyguard() { + try { + mVoiceInteractionManagerService.launchVoiceAssistFromKeyguard(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call launchVoiceAssistFromKeyguard", e); + } + } + + public boolean activeServiceSupportsAssistGesture() { + try { + return mVoiceInteractionManagerService != null + && mVoiceInteractionManagerService.activeServiceSupportsAssist(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call activeServiceSupportsAssistGesture", e); + return false; + } + } + + public boolean activeServiceSupportsLaunchFromKeyguard() { + try { + return mVoiceInteractionManagerService != null + && mVoiceInteractionManagerService.activeServiceSupportsLaunchFromKeyguard(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call activeServiceSupportsLaunchFromKeyguard", e); + return false; + } + } + + public ComponentName getActiveServiceComponentName() { + try { + return mVoiceInteractionManagerService.getActiveServiceComponentName(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call getActiveServiceComponentName", e); + return null; + } + } + + public boolean isSessionRunning() { + try { + return mVoiceInteractionManagerService != null + && mVoiceInteractionManagerService.isSessionRunning(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call isSessionRunning", e); + return false; + } + } + + public void hideCurrentSession() { + try { + mVoiceInteractionManagerService.hideCurrentSession(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call hideCurrentSession", e); + } + } + + public ComponentName getAssistComponentForUser(int userId) { + final String setting = Settings.Secure.getStringForUser(mContext.getContentResolver(), + Settings.Secure.ASSISTANT, userId); + if (setting != null) { + return ComponentName.unflattenFromString(setting); + } + + // Fallback to keep backward compatible behavior when there is no user setting. + if (activeServiceSupportsAssistGesture()) { + return getActiveServiceComponentName(); + } + + Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, userId); + if (intent != null) { + return intent.getComponent(); + } + + return null; + } + +} diff --git a/core/java/com/android/internal/app/ToolbarActionBar.java b/core/java/com/android/internal/app/ToolbarActionBar.java index 34b9dcb..2b162af 100644 --- a/core/java/com/android/internal/app/ToolbarActionBar.java +++ b/core/java/com/android/internal/app/ToolbarActionBar.java @@ -83,7 +83,9 @@ public class ToolbarActionBar extends ActionBar { @Override public void setCustomView(View view, LayoutParams layoutParams) { - view.setLayoutParams(layoutParams); + if (view != null) { + view.setLayoutParams(layoutParams); + } mDecorToolbar.setCustomView(view); } diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java index 2539a35..f81658e 100644 --- a/core/java/com/android/internal/os/RuntimeInit.java +++ b/core/java/com/android/internal/os/RuntimeInit.java @@ -24,6 +24,7 @@ import android.os.Debug; import android.os.IBinder; import android.os.Process; import android.os.SystemProperties; +import android.os.Trace; import android.util.Log; import android.util.Slog; import com.android.internal.logging.AndroidConfig; @@ -269,11 +270,11 @@ public class RuntimeInit { throws ZygoteInit.MethodAndArgsCaller { if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote"); + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit"); redirectLogStreams(); commonInit(); nativeZygoteInit(); - applicationInit(targetSdkVersion, argv, classLoader); } @@ -318,6 +319,9 @@ public class RuntimeInit { return; } + // The end of of the RuntimeInit event (see #zygoteInit). + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + // Remaining arguments are passed to the start class's static main invokeStaticMain(args.startClass, args.startArgs, classLoader); } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 1e7ee5a..4f6d781 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -17,6 +17,7 @@ package com.android.internal.os; +import android.os.Trace; import dalvik.system.ZygoteHooks; import android.system.ErrnoException; import android.system.Os; @@ -88,6 +89,13 @@ public final class Zygote { int pid = nativeForkAndSpecialize( uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose, instructionSet, appDataDir); + // Enable tracing as soon as possible for the child process. + if (pid == 0) { + Trace.setTracingEnabled(true); + + // Note that this event ends at the end of handleChildProc, + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "PostFork"); + } VM_HOOKS.postForkCommon(); return pid; } @@ -124,6 +132,10 @@ public final class Zygote { VM_HOOKS.preFork(); int pid = nativeForkSystemServer( uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities); + // Enable tracing as soon as we enter the system_server. + if (pid == 0) { + Trace.setTracingEnabled(true); + } VM_HOOKS.postForkCommon(); return pid; } diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index 969d236..1a0345b 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -27,6 +27,7 @@ import android.net.LocalSocket; import android.os.Process; import android.os.SELinux; import android.os.SystemProperties; +import android.os.Trace; import android.system.ErrnoException; import android.system.Os; import android.util.Log; @@ -711,7 +712,6 @@ class ZygoteConnection { private void handleChildProc(Arguments parsedArgs, FileDescriptor[] descriptors, FileDescriptor pipeFd, PrintStream newStderr) throws ZygoteInit.MethodAndArgsCaller { - /** * By the time we get here, the native code has closed the two actual Zygote * socket connections, and substituted /dev/null in their place. The LocalSocket @@ -740,6 +740,8 @@ class ZygoteConnection { Process.setArgV0(parsedArgs.niceName); } + // End of the postFork event. + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); if (parsedArgs.invokeWith != null) { WrapperInit.execApplication(parsedArgs.invokeWith, parsedArgs.niceName, parsedArgs.targetSdkVersion, diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 294e4ba..66f6079 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -390,6 +390,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } else { mLayoutInflater.inflate(layoutResID, mContentParent); } + mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); @@ -419,6 +420,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } else { mContentParent.addView(view, params); } + mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); @@ -435,6 +437,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { Log.v(TAG, "addContentView does not support content transitions"); } mContentParent.addView(view, params); + mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java index 661dce1..99c1277 100644 --- a/core/java/com/android/internal/view/FloatingActionMode.java +++ b/core/java/com/android/internal/view/FloatingActionMode.java @@ -48,12 +48,14 @@ public class FloatingActionMode extends ActionMode { private final Runnable mMovingOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setMoving(false); + mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; private final Runnable mHideOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setHideRequested(false); + mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; @@ -87,6 +89,7 @@ public class FloatingActionMode extends ActionMode { } }); mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar); + mFloatingToolbarVisibilityHelper.activate(); } @Override @@ -108,8 +111,7 @@ public class FloatingActionMode extends ActionMode { public void invalidate() { checkToolbarInitialized(); mCallback.onPrepareActionMode(this, mMenu); - mFloatingToolbar.updateLayout(); - invalidateContentRect(); + invalidateContentRect(); // Will re-layout and show the toolbar if necessary. } @Override @@ -131,44 +133,43 @@ public class FloatingActionMode extends ActionMode { mContentRectOnWindow.set(mContentRect); mContentRectOnWindow.offset(mViewPosition[0], mViewPosition[1]); - // Make sure that content rect is not out of the view's visible bounds. - mContentRectOnWindow.set( - Math.max(mContentRectOnWindow.left, mViewRect.left), - Math.max(mContentRectOnWindow.top, mViewRect.top), - Math.min(mContentRectOnWindow.right, mViewRect.right), - Math.min(mContentRectOnWindow.bottom, mViewRect.bottom)); - - if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) { - if (!mPreviousContentRectOnWindow.isEmpty()) { - notifyContentRectMoving(); - } - mFloatingToolbar.setContentRect(mContentRectOnWindow); - mFloatingToolbar.updateLayout(); - } - mPreviousContentRectOnWindow.set(mContentRectOnWindow); if (isContentRectWithinBounds()) { mFloatingToolbarVisibilityHelper.setOutOfBounds(false); + // Make sure that content rect is not out of the view's visible bounds. + mContentRectOnWindow.set( + Math.max(mContentRectOnWindow.left, mViewRect.left), + Math.max(mContentRectOnWindow.top, mViewRect.top), + Math.min(mContentRectOnWindow.right, mViewRect.right), + Math.min(mContentRectOnWindow.bottom, mViewRect.bottom)); + + if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) { + // Content rect is moving. + mOriginatingView.removeCallbacks(mMovingOff); + mFloatingToolbarVisibilityHelper.setMoving(true); + mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); + + mFloatingToolbar.setContentRect(mContentRectOnWindow); + mFloatingToolbar.updateLayout(); + } } else { mFloatingToolbarVisibilityHelper.setOutOfBounds(true); + mContentRectOnWindow.setEmpty(); } - } + mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); - private boolean isContentRectWithinBounds() { - mScreenRect.set( - 0, - 0, - mContext.getResources().getDisplayMetrics().widthPixels, - mContext.getResources().getDisplayMetrics().heightPixels); - - return Rect.intersects(mContentRectOnWindow, mScreenRect) - && Rect.intersects(mContentRectOnWindow, mViewRect); + mPreviousContentRectOnWindow.set(mContentRectOnWindow); } - private void notifyContentRectMoving() { - mOriginatingView.removeCallbacks(mMovingOff); - mFloatingToolbarVisibilityHelper.setMoving(true); - mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); + private boolean isContentRectWithinBounds() { + mScreenRect.set( + 0, + 0, + mContext.getResources().getDisplayMetrics().widthPixels, + mContext.getResources().getDisplayMetrics().heightPixels); + + return Rect.intersects(mContentRectOnWindow, mScreenRect) + && Rect.intersects(mContentRectOnWindow, mViewRect); } @Override @@ -184,6 +185,7 @@ public class FloatingActionMode extends ActionMode { mHideOff.run(); } else { mFloatingToolbarVisibilityHelper.setHideRequested(true); + mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); mOriginatingView.postDelayed(mHideOff, duration); } } @@ -221,7 +223,7 @@ public class FloatingActionMode extends ActionMode { } /** - * @throws IlllegalStateException + * @throws IllegalStateException */ private void checkToolbarInitialized() { Preconditions.checkState(mFloatingToolbar != null); @@ -229,13 +231,14 @@ public class FloatingActionMode extends ActionMode { } private void reset() { + mFloatingToolbarVisibilityHelper.deactivate(); mOriginatingView.removeCallbacks(mMovingOff); mOriginatingView.removeCallbacks(mHideOff); } /** - * A helper that shows/hides the floating toolbar depending on certain states. + * A helper for showing/hiding the floating toolbar depending on certain states. */ private static final class FloatingToolbarVisibilityHelper { @@ -245,29 +248,45 @@ public class FloatingActionMode extends ActionMode { private boolean mMoving; private boolean mOutOfBounds; + private boolean mActive; + public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) { mToolbar = Preconditions.checkNotNull(toolbar); } + public void activate() { + mHideRequested = false; + mMoving = false; + mOutOfBounds = false; + + mActive = true; + } + + public void deactivate() { + mActive = false; + mToolbar.dismiss(); + } + public void setHideRequested(boolean hide) { mHideRequested = hide; - updateToolbarVisibility(); } public void setMoving(boolean moving) { mMoving = moving; - updateToolbarVisibility(); } public void setOutOfBounds(boolean outOfBounds) { mOutOfBounds = outOfBounds; - updateToolbarVisibility(); } - private void updateToolbarVisibility() { + public void updateToolbarVisibility() { + if (!mActive) { + return; + } + if (mHideRequested || mMoving || mOutOfBounds) { mToolbar.hide(); - } else if (mToolbar.isHidden()) { + } else { mToolbar.show(); } } diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 2d0989f..53ebc23 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -37,7 +37,6 @@ import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; -import android.view.WindowInsets; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationSet; @@ -436,8 +435,6 @@ public final class FloatingToolbar { // The "show" animation will make this visible. mContentContainer.setAlpha(0); } - refreshViewPort(); - updateOverflowHeight(contentRect.top - (mMarginVertical * 2) - mViewPort.top); refreshCoordinatesAndOverflowDirection(contentRect); preparePopupContent(); mPopupWindow.showAtLocation(mParent, Gravity.NO_GRAVITY, mCoords.x, mCoords.y); @@ -501,7 +498,6 @@ public final class FloatingToolbar { } cancelOverflowAnimations(); - refreshViewPort(); refreshCoordinatesAndOverflowDirection(contentRect); preparePopupContent(); mPopupWindow.update(mCoords.x, mCoords.y, getWidth(), getHeight()); @@ -529,28 +525,65 @@ public final class FloatingToolbar { } private void refreshCoordinatesAndOverflowDirection(Rect contentRect) { - // NOTE: Ensure that mViewPort has been refreshed before this. + refreshViewPort(); - int x = contentRect.centerX() - getWidth() / 2; - int y; - if (contentRect.top - getHeight() > mViewPort.top) { - y = contentRect.top - getHeight(); - mOverflowDirection = FloatingToolbarPopup.OVERFLOW_DIRECTION_UP; - } else if (contentRect.top - getToolbarHeightWithVerticalMargin() > mViewPort.top) { - y = contentRect.top - getToolbarHeightWithVerticalMargin(); - mOverflowDirection = FloatingToolbarPopup.OVERFLOW_DIRECTION_DOWN; - } else { - y = contentRect.bottom; - mOverflowDirection = FloatingToolbarPopup.OVERFLOW_DIRECTION_DOWN; - } + int availableHeightAboveContent = + contentRect.top - mViewPort.top - 2 * mMarginVertical; + int availableHeightBelowContent = + mViewPort.bottom - contentRect.bottom - 2 * mMarginVertical; + int availableHeightThroughContent = + mViewPort.bottom - contentRect.top + getToolbarHeightWithVerticalMargin(); + int x = contentRect.centerX() - getWidth() / 2; // Update x so that the toolbar isn't rendered behind the nav bar in landscape. x = Math.max(0, Math.min(x, mViewPort.right - getWidth())); - mCoords.set(x, y); - if (mOverflowPanel != null) { + int y; + if (mOverflowPanel == null) { // There is no overflow. + if (availableHeightAboveContent > getToolbarHeightWithVerticalMargin()) { + // There is enough space at the top of the content. + y = contentRect.top - getToolbarHeightWithVerticalMargin(); + } else if (availableHeightBelowContent > getToolbarHeightWithVerticalMargin()) { + // There is enough space at the bottom of the content. + y = contentRect.bottom; + } else { + // Not enough space. Prefer to position as high as possible. + y = Math.max( + mViewPort.top, + contentRect.top - getToolbarHeightWithVerticalMargin()); + } + } else { // There is an overflow. + if (availableHeightAboveContent > mOverflowPanel.getMinimumHeight()) { + // There is enough space at the top of the content rect for the overflow. + // Position above and open upwards. + updateOverflowHeight(availableHeightAboveContent); + y = contentRect.top - getHeight(); + mOverflowDirection = OVERFLOW_DIRECTION_UP; + } else if (availableHeightAboveContent > getToolbarHeightWithVerticalMargin() + && availableHeightThroughContent > mOverflowPanel.getMinimumHeight()) { + // There is enough space at the top of the content rect for the main panel + // but not the overflow. + // Position above but open downwards. + updateOverflowHeight(availableHeightThroughContent); + y = contentRect.top - getToolbarHeightWithVerticalMargin(); + mOverflowDirection = OVERFLOW_DIRECTION_DOWN; + } else if (availableHeightBelowContent > mOverflowPanel.getMinimumHeight()) { + // There is enough space at the bottom of the content rect for the overflow. + // Position below and open downwards. + updateOverflowHeight(availableHeightBelowContent); + y = contentRect.bottom; + mOverflowDirection = OVERFLOW_DIRECTION_DOWN; + } else { + // Not enough space. + // Position at the bottom of the view port and open upwards. + updateOverflowHeight(mViewPort.height()); + y = mViewPort.bottom - getHeight(); + mOverflowDirection = OVERFLOW_DIRECTION_UP; + } mOverflowPanel.setOverflowDirection(mOverflowDirection); } + + mCoords.set(x, y); } private int getToolbarHeightWithVerticalMargin() { @@ -837,13 +870,7 @@ public final class FloatingToolbar { private void refreshViewPort() { - mParent.getGlobalVisibleRect(mViewPort); - WindowInsets windowInsets = mParent.getRootWindowInsets(); - mViewPort.set( - mViewPort.left + windowInsets.getStableInsetLeft(), - mViewPort.top + windowInsets.getStableInsetTop(), - mViewPort.right - windowInsets.getStableInsetRight(), - mViewPort.bottom - windowInsets.getStableInsetBottom()); + mParent.getWindowVisibleDisplayFrame(mViewPort); } private int getToolbarWidth(int suggestedWidth) { @@ -1139,6 +1166,12 @@ public final class FloatingToolbar { setListViewHeight(); } + public int getMinimumHeight() { + return mContentView.getContext().getResources(). + getDimensionPixelSize(R.dimen.floating_toolbar_minimum_overflow_height) + + getEstimatedToolbarHeight(mContentView.getContext()); + } + /** * Returns the content view of the overflow. */ @@ -1173,13 +1206,18 @@ public final class FloatingToolbar { getDimensionPixelSize(R.dimen.floating_toolbar_maximum_overflow_height); int minHeight = mContentView.getContext().getResources(). getDimensionPixelSize(R.dimen.floating_toolbar_minimum_overflow_height); - int availableHeight = mSuggestedHeight - (mSuggestedHeight % itemHeight) + int suggestedListViewHeight = mSuggestedHeight - (mSuggestedHeight % itemHeight) - itemHeight; // reserve space for the back button. ViewGroup.LayoutParams params = mListView.getLayoutParams(); - if (availableHeight >= minHeight) { - params.height = Math.min(Math.min(availableHeight, maxHeight), height); - } else { + if (suggestedListViewHeight <= 0) { + // Invalid height. Use the maximum height available. params.height = Math.min(maxHeight, height); + } else if (suggestedListViewHeight < minHeight) { + // Height is smaller than minimum allowed. Use minimum height. + params.height = minHeight; + } else { + // Use the suggested height. Cap it at the maximum available height. + params.height = Math.min(Math.min(suggestedListViewHeight, maxHeight), height); } mListView.setLayoutParams(params); } @@ -1360,6 +1398,7 @@ public final class FloatingToolbar { PopupWindow popupWindow = new PopupWindow(popupContentHolder); popupWindow.setWindowLayoutType( WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL); + popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupWindow.setAnimationStyle(0); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); content.setLayoutParams(new ViewGroup.LayoutParams( diff --git a/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java b/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java index 3f4b980..c0215a8 100644 --- a/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java +++ b/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java @@ -28,8 +28,6 @@ import android.app.backup.BackupHelper; import android.content.ContentResolver; import android.content.Context; import android.content.SyncAdapterType; -import android.content.SyncStatusObserver; -import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -47,8 +45,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; /** * Helper for backing up account sync settings (whether or not a service should be synced). The @@ -270,6 +266,10 @@ public class AccountSyncSettingsBackupHelper implements BackupHelper { // yet won't be restored. if (currentAccounts.contains(account)) { restoreExistingAccountSyncSettingsFromJSON(accountJSON); + } else { + // TODO: + // Stash the data to a file that the SyncManager can read from to restore + // settings at a later date. } } } finally { @@ -300,6 +300,31 @@ public class AccountSyncSettingsBackupHelper implements BackupHelper { /** * Restore account sync settings using the given JSON. This function won't work if the account * doesn't exist yet. + * This function will only be called during Setup Wizard, where we are guaranteed that there + * are no active syncs. + * There are 2 pieces of data to restore - + * isSyncable (corresponds to {@link ContentResolver#getIsSyncable(Account, String)} + * syncEnabled (corresponds to {@link ContentResolver#getSyncAutomatically(Account, String)} + * <strong>The restore favours adapters that were enabled on the old device, and doesn't care + * about adapters that were disabled.</strong> + * + * syncEnabled=true in restore data. + * syncEnabled will be true on this device. isSyncable will be left as the default in order to + * give the enabled adapter the chance to run an initialization sync. + * + * syncEnabled=false in restore data. + * syncEnabled will be false on this device. isSyncable will be set to 2, unless it was 0 on the + * old device in which case it will be set to 0 on this device. This is because isSyncable=0 is + * a rare state and was probably set to 0 for good reason (historically isSyncable is a way by + * which adapters control their own sync state independently of sync settings which is + * toggleable by the user). + * isSyncable=2 is a new isSyncable state we introduced specifically to allow adapters that are + * disabled after a restore to run initialization logic when the adapter is later enabled. + * See com.android.server.content.SyncStorageEngine#setSyncAutomatically + * + * The end result is that an adapter that the user had on will be turned on and get an + * initialization sync, while an adapter that the user had off will be off until the user + * enables it on this device at which point it will get an initialization sync. */ private void restoreExistingAccountSyncSettingsFromJSON(JSONObject accountJSON) throws JSONException { @@ -307,72 +332,27 @@ public class AccountSyncSettingsBackupHelper implements BackupHelper { JSONArray authorities = accountJSON.getJSONArray(KEY_ACCOUNT_AUTHORITIES); String accountName = accountJSON.getString(KEY_ACCOUNT_NAME); String accountType = accountJSON.getString(KEY_ACCOUNT_TYPE); + final Account account = new Account(accountName, accountType); for (int i = 0; i < authorities.length(); i++) { JSONObject authority = (JSONObject) authorities.get(i); final String authorityName = authority.getString(KEY_AUTHORITY_NAME); - boolean syncEnabled = authority.getBoolean(KEY_AUTHORITY_SYNC_ENABLED); - - // Cancel any active syncs. - if (ContentResolver.isSyncActive(account, authorityName)) { - ContentResolver.cancelSync(account, authorityName); - } - - boolean overwriteSync = true; - Bundle initializationExtras = createSyncInitializationBundle(); - int currentSyncState = ContentResolver.getIsSyncable(account, authorityName); - if (currentSyncState < 0) { - // Requesting a sync is an asynchronous operation, so we setup a countdown latch to - // wait for it to finish. Initialization syncs are generally very brief and - // shouldn't take too much time to finish. - final CountDownLatch latch = new CountDownLatch(1); - Object syncStatusObserverHandle = ContentResolver.addStatusChangeListener( - ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, new SyncStatusObserver() { - @Override - public void onStatusChanged(int which) { - if (!ContentResolver.isSyncActive(account, authorityName)) { - latch.countDown(); - } - } - }); - - // If we set sync settings for a sync that hasn't been initialized yet, we run the - // risk of having our changes overwritten later on when the sync gets initialized. - // To prevent this from happening we will manually initiate the sync adapter. We - // also explicitly pass in a Bundle with SYNC_EXTRAS_INITIALIZE to prevent a data - // sync from running after the initialization sync. Two syncs will be scheduled, but - // the second one (data sync) will override the first one (initialization sync) and - // still behave as an initialization sync because of the Bundle. - ContentResolver.requestSync(account, authorityName, initializationExtras); - - boolean done = false; - try { - done = latch.await(SYNC_REQUEST_LATCH_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Log.e(TAG, "CountDownLatch interrupted\n" + e); - done = false; - } - if (!done) { - overwriteSync = false; - Log.i(TAG, "CountDownLatch timed out, skipping '" + authorityName - + "' authority."); - } - ContentResolver.removeStatusChangeListener(syncStatusObserverHandle); - } - - if (overwriteSync) { - ContentResolver.setSyncAutomatically(account, authorityName, syncEnabled); - Log.i(TAG, "Set sync automatically for '" + authorityName + "': " + syncEnabled); + boolean wasSyncEnabled = authority.getBoolean(KEY_AUTHORITY_SYNC_ENABLED); + int wasSyncable = authority.getInt(KEY_AUTHORITY_SYNC_STATE); + + ContentResolver.setSyncAutomaticallyAsUser( + account, authorityName, wasSyncEnabled, 0 /* user Id */); + + if (!wasSyncEnabled) { + ContentResolver.setIsSyncable( + account, + authorityName, + wasSyncable == 0 ? + 0 /* not syncable */ : 2 /* syncable but needs initialization */); } } } - private Bundle createSyncInitializationBundle() { - Bundle extras = new Bundle(); - extras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true); - return extras; - } - @Override public void writeNewStateDescription(ParcelFileDescriptor newState) { diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index 2229071..7d8d151 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -371,8 +371,8 @@ ssize_t JniInputByteBuffer::read(uint8_t* buf, size_t offset, size_t count) { realCount = count; } - jobject chainingBuf = mEnv->CallObjectMethod(mInBuf, gInputByteBufferClassInfo.mGetMethod, mByteArray, 0, - realCount); + jobject chainingBuf = mEnv->CallObjectMethod(mInBuf, gInputByteBufferClassInfo.mGetMethod, + mByteArray, 0, realCount); mEnv->DeleteLocalRef(chainingBuf); if (mEnv->ExceptionCheck()) { @@ -630,8 +630,10 @@ static bool validateDngHeader(JNIEnv* env, TiffWriter* writer, jint width, jint bool hasThumbnail = writer->hasIfd(TIFF_IFD_SUB1); // TODO: handle lens shading map, etc. conversions for other raw buffer sizes. - uint32_t metadataWidth = *(writer->getEntry(TAG_IMAGEWIDTH, (hasThumbnail) ? TIFF_IFD_SUB1 : TIFF_IFD_0)->getData<uint32_t>()); - uint32_t metadataHeight = *(writer->getEntry(TAG_IMAGELENGTH, (hasThumbnail) ? TIFF_IFD_SUB1 : TIFF_IFD_0)->getData<uint32_t>()); + uint32_t metadataWidth = *(writer->getEntry(TAG_IMAGEWIDTH, (hasThumbnail) ? TIFF_IFD_SUB1 : + TIFF_IFD_0)->getData<uint32_t>()); + uint32_t metadataHeight = *(writer->getEntry(TAG_IMAGELENGTH, (hasThumbnail) ? TIFF_IFD_SUB1 : + TIFF_IFD_0)->getData<uint32_t>()); if (width < 0 || metadataWidth != static_cast<uint32_t>(width)) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", \ @@ -641,7 +643,8 @@ static bool validateDngHeader(JNIEnv* env, TiffWriter* writer, jint width, jint if (height < 0 || metadataHeight != static_cast<uint32_t>(height)) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", \ - "Metadata height %d doesn't match image height %d", metadataHeight, height); + "Metadata height %d doesn't match image height %d", + metadataHeight, height); return false; } @@ -1428,7 +1431,11 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt } { - // Setup opcode List 2 + // Set up opcode List 2 + OpcodeListBuilder builder; + status_t err = OK; + + // Set up lens shading map camera_metadata_entry entry1 = characteristics.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE); @@ -1444,34 +1451,71 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt results.find(ANDROID_STATISTICS_LENS_SHADING_MAP); if (entry2.count > 0 && entry2.count == lsmWidth * lsmHeight * 4) { - - OpcodeListBuilder builder; - status_t err = builder.addGainMapsForMetadata(lsmWidth, - lsmHeight, - 0, - 0, - imageHeight, - imageWidth, - opcodeCfaLayout, - entry2.data.f); - if (err == OK) { - size_t listSize = builder.getSize(); - uint8_t opcodeListBuf[listSize]; - err = builder.buildOpList(opcodeListBuf); - if (err == OK) { - BAIL_IF_INVALID(writer->addEntry(TAG_OPCODELIST2, listSize, opcodeListBuf, - TIFF_IFD_0), env, TAG_OPCODELIST2, writer); - } else { - ALOGE("%s: Could not build Lens shading map opcode.", __FUNCTION__); - jniThrowRuntimeException(env, "failed to construct lens shading map opcode."); - } - } else { + err = builder.addGainMapsForMetadata(lsmWidth, + lsmHeight, + 0, + 0, + imageHeight, + imageWidth, + opcodeCfaLayout, + entry2.data.f); + if (err != OK) { ALOGE("%s: Could not add Lens shading map.", __FUNCTION__); jniThrowRuntimeException(env, "failed to add lens shading map."); + return; } + } + + size_t listSize = builder.getSize(); + uint8_t opcodeListBuf[listSize]; + err = builder.buildOpList(opcodeListBuf); + if (err == OK) { + BAIL_IF_INVALID(writer->addEntry(TAG_OPCODELIST2, listSize, opcodeListBuf, + TIFF_IFD_0), env, TAG_OPCODELIST2, writer); } else { - ALOGW("%s: No lens shading map found in result metadata. Image quality may be reduced.", - __FUNCTION__); + ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading" + "map.", __FUNCTION__); + jniThrowRuntimeException(env, "failed to construct opcode list for distortion" + " correction and lens shading map"); + return; + } + } + + { + // Set up opcode List 3 + OpcodeListBuilder builder; + status_t err = OK; + + // Set up rectilinear distortion correction + camera_metadata_entry entry3 = + results.find(ANDROID_LENS_RADIAL_DISTORTION); + camera_metadata_entry entry4 = + results.find(ANDROID_LENS_INTRINSIC_CALIBRATION); + + if (entry3.count == 6 && entry4.count == 5) { + float cx = entry4.data.f[/*c_x*/2]; + float cy = entry4.data.f[/*c_y*/3]; + err = builder.addWarpRectilinearForMetadata(entry3.data.f, imageWidth, imageHeight, cx, + cy); + if (err != OK) { + ALOGE("%s: Could not add distortion correction.", __FUNCTION__); + jniThrowRuntimeException(env, "failed to add distortion correction."); + return; + } + } + + size_t listSize = builder.getSize(); + uint8_t opcodeListBuf[listSize]; + err = builder.buildOpList(opcodeListBuf); + if (err == OK) { + BAIL_IF_INVALID(writer->addEntry(TAG_OPCODELIST3, listSize, opcodeListBuf, + TIFF_IFD_0), env, TAG_OPCODELIST3, writer); + } else { + ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading" + "map.", __FUNCTION__); + jniThrowRuntimeException(env, "failed to construct opcode list for distortion" + " correction and lens shading map"); + return; } } @@ -1693,6 +1737,7 @@ static void DngCreator_nativeSetThumbnail(JNIEnv* env, jobject thiz, jobject buf tagsToMove.add(TAG_DEFAULTCROPORIGIN); tagsToMove.add(TAG_DEFAULTCROPSIZE); tagsToMove.add(TAG_OPCODELIST2); + tagsToMove.add(TAG_OPCODELIST3); if (moveEntries(writer, TIFF_IFD_0, TIFF_IFD_SUB1, tagsToMove) != OK) { jniThrowException(env, "java/lang/IllegalStateException", "Failed to move entries"); diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h index 5144457..bb13c35 100644 --- a/core/jni/android_media_AudioFormat.h +++ b/core/jni/android_media_AudioFormat.h @@ -80,6 +80,13 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat) return ENCODING_PCM_8BIT; case AUDIO_FORMAT_PCM_FLOAT: return ENCODING_PCM_FLOAT; + + // map these to ENCODING_PCM_FLOAT + case AUDIO_FORMAT_PCM_8_24_BIT: + case AUDIO_FORMAT_PCM_24_BIT_PACKED: + case AUDIO_FORMAT_PCM_32_BIT: + return ENCODING_PCM_FLOAT; + case AUDIO_FORMAT_AC3: return ENCODING_AC3; case AUDIO_FORMAT_E_AC3: diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 1cd07d1..9f2181f 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -677,13 +677,14 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, // constructed by java code with correct class type (device, mix etc...) // and reference to AudioPort instance in this client jAudioPort = env->NewObject(gAudioPortClass, gAudioPortCstor, - jHandle, - 0, - NULL, - NULL, - NULL, - NULL, - NULL); + jHandle, // handle + 0, // role + NULL, // name + NULL, // samplingRates + NULL, // channelMasks + NULL, // channelIndexMasks + NULL, // formats + NULL); // gains env->DeleteLocalRef(jHandle); if (jAudioPort == NULL) { return (jint)AUDIO_JAVA_ERROR; @@ -831,18 +832,31 @@ exit: return jStatus; } +static bool hasFormat(int* formats, size_t size, int format) { + for (size_t index = 0; index < size; index++) { + if (formats[index] == format) { + return true; // found + } + } + return false; // not found +} + static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, const struct audio_port *nAudioPort) { jint jStatus = (jint)AUDIO_JAVA_SUCCESS; jintArray jSamplingRates = NULL; jintArray jChannelMasks = NULL; + jintArray jChannelIndexMasks = NULL; + int* cFormats = NULL; jintArray jFormats = NULL; jobjectArray jGains = NULL; jobject jHandle = NULL; jstring jDeviceName = NULL; bool useInMask; - + size_t numPositionMasks = 0; + size_t numIndexMasks = 0; + size_t numUniqueFormats; ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", nAudioPort->id, nAudioPort->role, nAudioPort->type, nAudioPort->name); @@ -856,41 +870,69 @@ static jint convertAudioPortFromNative(JNIEnv *env, (jint *)nAudioPort->sample_rates); } - jChannelMasks = env->NewIntArray(nAudioPort->num_channel_masks); + // count up how many masks are positional and indexed + for(size_t index = 0; index < nAudioPort->num_channel_masks; index++) { + const audio_channel_mask_t mask = nAudioPort->channel_masks[index]; + if (audio_channel_mask_get_representation(mask) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { + numIndexMasks++; + } else { + numPositionMasks++; + } + } + + jChannelMasks = env->NewIntArray(numPositionMasks); if (jChannelMasks == NULL) { jStatus = (jint)AUDIO_JAVA_ERROR; goto exit; } + jChannelIndexMasks = env->NewIntArray(numIndexMasks); + if (jChannelIndexMasks == NULL) { + jStatus = (jint)AUDIO_JAVA_ERROR; + goto exit; + } useInMask = useInChannelMask(nAudioPort->type, nAudioPort->role); - jint jMask; - for (size_t j = 0; j < nAudioPort->num_channel_masks; j++) { - if (useInMask) { - jMask = inChannelMaskFromNative(nAudioPort->channel_masks[j]); + // put the masks in the output arrays + for (size_t maskIndex = 0, posMaskIndex = 0, indexedMaskIndex = 0; + maskIndex < nAudioPort->num_channel_masks; maskIndex++) { + const audio_channel_mask_t mask = nAudioPort->channel_masks[maskIndex]; + if (audio_channel_mask_get_representation(mask) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { + jint jMask = audio_channel_mask_get_bits(mask); + env->SetIntArrayRegion(jChannelIndexMasks, indexedMaskIndex++, 1, &jMask); } else { - jMask = outChannelMaskFromNative(nAudioPort->channel_masks[j]); + jint jMask = useInMask ? inChannelMaskFromNative(mask) + : outChannelMaskFromNative(mask); + env->SetIntArrayRegion(jChannelMasks, posMaskIndex++, 1, &jMask); } - env->SetIntArrayRegion(jChannelMasks, j, 1, &jMask); } - jFormats = env->NewIntArray(nAudioPort->num_formats); + // formats + cFormats = new int[nAudioPort->num_formats]; + numUniqueFormats = 0; + for (size_t index = 0; index < nAudioPort->num_formats; index++) { + int format = audioFormatFromNative(nAudioPort->formats[index]); + if (!hasFormat(cFormats, numUniqueFormats, format)) { + cFormats[numUniqueFormats++] = format; + } + } + jFormats = env->NewIntArray(numUniqueFormats); if (jFormats == NULL) { jStatus = (jint)AUDIO_JAVA_ERROR; goto exit; } - for (size_t j = 0; j < nAudioPort->num_formats; j++) { - jint jFormat = audioFormatFromNative(nAudioPort->formats[j]); - env->SetIntArrayRegion(jFormats, j, 1, &jFormat); - } + env->SetIntArrayRegion(jFormats, 0, numUniqueFormats, cFormats); + // gains jGains = env->NewObjectArray(nAudioPort->num_gains, gAudioGainClass, NULL); if (jGains == NULL) { jStatus = (jint)AUDIO_JAVA_ERROR; goto exit; } + for (size_t j = 0; j < nAudioPort->num_gains; j++) { audio_channel_mask_t nMask = nAudioPort->gains[j].channel_mask; + jint jMask; if (useInMask) { jMask = inChannelMaskFromNative(nMask); ALOGV("convertAudioPortConfigFromNative IN mask java %x native %x", jMask, nMask); @@ -931,7 +973,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, jstring jAddress = env->NewStringUTF(nAudioPort->ext.device.address); *jAudioPort = env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor, jHandle, jDeviceName, - jSamplingRates, jChannelMasks, jFormats, jGains, + jSamplingRates, jChannelMasks, jChannelIndexMasks, + jFormats, jGains, nAudioPort->ext.device.type, jAddress); env->DeleteLocalRef(jAddress); } else if (nAudioPort->type == AUDIO_PORT_TYPE_MIX) { @@ -939,7 +982,7 @@ static jint convertAudioPortFromNative(JNIEnv *env, *jAudioPort = env->NewObject(gAudioMixPortClass, gAudioMixPortCstor, jHandle, nAudioPort->ext.mix.handle, nAudioPort->role, jDeviceName, - jSamplingRates, jChannelMasks, + jSamplingRates, jChannelMasks, jChannelIndexMasks, jFormats, jGains); } else { ALOGE("convertAudioPortFromNative unknown nAudioPort type %d", nAudioPort->type); @@ -972,6 +1015,12 @@ exit: if (jChannelMasks != NULL) { env->DeleteLocalRef(jChannelMasks); } + if (jChannelIndexMasks != NULL) { + env->DeleteLocalRef(jChannelIndexMasks); + } + if (cFormats != NULL) { + delete[] cFormats; + } if (jFormats != NULL) { env->DeleteLocalRef(jFormats); } @@ -1634,7 +1683,7 @@ int register_android_media_AudioSystem(JNIEnv *env) jclass audioPortClass = FindClassOrDie(env, "android/media/AudioPort"); gAudioPortClass = MakeGlobalRefOrDie(env, audioPortClass); gAudioPortCstor = GetMethodIDOrDie(env, audioPortClass, "<init>", - "(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[Landroid/media/AudioGain;)V"); + "(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V"); gAudioPortFields.mHandle = GetFieldIDOrDie(env, audioPortClass, "mHandle", "Landroid/media/AudioHandle;"); gAudioPortFields.mRole = GetFieldIDOrDie(env, audioPortClass, "mRole", "I"); @@ -1672,12 +1721,12 @@ int register_android_media_AudioSystem(JNIEnv *env) jclass audioDevicePortClass = FindClassOrDie(env, "android/media/AudioDevicePort"); gAudioDevicePortClass = MakeGlobalRefOrDie(env, audioDevicePortClass); gAudioDevicePortCstor = GetMethodIDOrDie(env, audioDevicePortClass, "<init>", - "(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V"); + "(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V"); jclass audioMixPortClass = FindClassOrDie(env, "android/media/AudioMixPort"); gAudioMixPortClass = MakeGlobalRefOrDie(env, audioMixPortClass); gAudioMixPortCstor = GetMethodIDOrDie(env, audioMixPortClass, "<init>", - "(Landroid/media/AudioHandle;IILjava/lang/String;[I[I[I[Landroid/media/AudioGain;)V"); + "(Landroid/media/AudioHandle;IILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V"); jclass audioGainClass = FindClassOrDie(env, "android/media/AudioGain"); gAudioGainClass = MakeGlobalRefOrDie(env, audioGainClass); diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp index 9a80f1d..2b1067b 100644 --- a/core/jni/android_util_Log.cpp +++ b/core/jni/android_util_Log.cpp @@ -41,32 +41,8 @@ struct levels_t { }; static levels_t levels; -static int toLevel(const char* value) -{ - switch (value[0]) { - case 'V': return levels.verbose; - case 'D': return levels.debug; - case 'I': return levels.info; - case 'W': return levels.warn; - case 'E': return levels.error; - case 'A': return levels.assert; - case 'S': return -1; // SUPPRESS - } - return levels.info; -} - static jboolean isLoggable(const char* tag, jint level) { - String8 key; - key.append(LOG_NAMESPACE); - key.append(tag); - - char buf[PROPERTY_VALUE_MAX]; - if (property_get(key.string(), buf, "") <= 0) { - buf[0] = '\0'; - } - - int logLevel = toLevel(buf); - return logLevel >= 0 && level >= logLevel; + return __android_log_is_loggable(level, tag, ANDROID_LOG_INFO); } static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level) diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp index 9307ff9..a526223 100644 --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -105,8 +105,8 @@ isFilenameSafe(const char* filename) } static bool -isFileDifferent(const char* filePath, size_t fileSize, time_t modifiedTime, - long zipCrc, struct stat64* st) +isFileDifferent(const char* filePath, uint32_t fileSize, time_t modifiedTime, + uint32_t zipCrc, struct stat64* st) { if (lstat64(filePath, st) < 0) { // File is not found or cannot be read. @@ -134,7 +134,9 @@ isFileDifferent(const char* filePath, size_t fileSize, time_t modifiedTime, return true; } - long crc = crc32(0L, Z_NULL, 0); + // uLong comes from zlib.h. It's a bit of a wart that they're + // potentially using a 64-bit type for a 32-bit CRC. + uLong crc = crc32(0L, Z_NULL, 0); unsigned char crcBuffer[16384]; ssize_t numBytes; while ((numBytes = TEMP_FAILURE_RETRY(read(fd, crcBuffer, sizeof(crcBuffer)))) > 0) { @@ -142,9 +144,9 @@ isFileDifferent(const char* filePath, size_t fileSize, time_t modifiedTime, } close(fd); - ALOGV("%s: crc = %lx, zipCrc = %lx\n", filePath, crc, zipCrc); + ALOGV("%s: crc = %lx, zipCrc = %" PRIu32 "\n", filePath, crc, zipCrc); - if (crc != zipCrc) { + if (crc != static_cast<uLong>(zipCrc)) { return true; } @@ -155,13 +157,13 @@ static install_status_t sumFiles(JNIEnv*, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntry, const char*) { size_t* total = (size_t*) arg; - size_t uncompLen; + uint32_t uncompLen; if (!zipFile->getEntryInfo(zipEntry, NULL, &uncompLen, NULL, NULL, NULL, NULL)) { return INSTALL_FAILED_INVALID_APK; } - *total += uncompLen; + *total += static_cast<size_t>(uncompLen); return INSTALL_SUCCEEDED; } @@ -181,12 +183,11 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr ScopedUtfChars nativeLibPath(env, *javaNativeLibPath); - size_t uncompLen; - long when; - long crc; - time_t modTime; + uint32_t uncompLen; + uint32_t when; + uint32_t crc; - int method; + uint16_t method; off64_t offset; if (!zipFile->getEntryInfo(zipEntry, &method, &uncompLen, NULL, &offset, &when, &crc)) { @@ -233,7 +234,7 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr // Only copy out the native file if it's different. struct tm t; ZipUtils::zipTimeToTimespec(when, &t); - modTime = mktime(&t); + const time_t modTime = mktime(&t); struct stat64 st; if (!isFileDifferent(localFileName, uncompLen, modTime, crc, &st)) { return INSTALL_SUCCEEDED; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index a434a13..65c064b 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -289,6 +289,8 @@ <protected-broadcast android:name="android.location.GPS_FIX_CHANGE" /> <protected-broadcast android:name="android.net.proxy.PAC_REFRESH" /> + <protected-broadcast android:name="android.telecom.action.DEFAULT_DIALER_CHANGED" /> + <protected-broadcast android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" /> diff --git a/core/res/res/drawable/control_background_32dp_material.xml b/core/res/res/drawable/control_background_32dp_material.xml new file mode 100644 index 0000000..1628734 --- /dev/null +++ b/core/res/res/drawable/control_background_32dp_material.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 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. +--> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="@color/control_highlight_material" + android:radius="16dp" /> diff --git a/core/res/res/drawable/control_background_material.xml b/core/res/res/drawable/control_background_40dp_material.xml index 7b78349..0e82ace 100644 --- a/core/res/res/drawable/control_background_material.xml +++ b/core/res/res/drawable/control_background_40dp_material.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<!-- Copyright (C) 2015 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. diff --git a/core/res/res/drawable/seekbar_track_material.xml b/core/res/res/drawable/seekbar_track_material.xml index 6e40c48..01eb243 100644 --- a/core/res/res/drawable/seekbar_track_material.xml +++ b/core/res/res/drawable/seekbar_track_material.xml @@ -20,7 +20,7 @@ <shape android:shape="rectangle" android:tint="?attr/colorControlNormal"> <size android:height="@dimen/seekbar_track_background_height_material" /> - <solid android:color="#ff000000" /> + <solid android:color="@color/white_disabled_material" /> </shape> </item> <item android:id="@id/secondaryProgress" diff --git a/core/res/res/drawable/spinner_background_material.xml b/core/res/res/drawable/spinner_background_material.xml index 892dbc5..d37f5b7 100644 --- a/core/res/res/drawable/spinner_background_material.xml +++ b/core/res/res/drawable/spinner_background_material.xml @@ -17,22 +17,18 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:paddingMode="stack" android:paddingStart="0dp" - android:paddingEnd="48dp" + android:paddingEnd="24dp" android:paddingLeft="0dp" android:paddingRight="0dp"> <item android:gravity="end|center_vertical" - android:width="48dp" - android:height="48dp"> - <ripple - android:color="?attr/colorControlHighlight" - android:radius="24dp" /> - </item> + android:width="24dp" + android:height="24dp" + android:drawable="@drawable/control_background_40dp_material" /> <item android:drawable="@drawable/ic_spinner_caret" android:gravity="end|center_vertical" android:width="24dp" - android:height="24dp" - android:end="12dp" /> + android:height="24dp" /> </layer-list> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 60ff80f..03cee7d 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="UNIT">%2$s</xliff:g><xliff:g id="NUMBER">%1$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dae"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Patroon begin"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patroon uitgevee"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel bygevoeg"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> is bygevoeg"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon klaar"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Legstuk %2$d van %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Voeg legstuk by."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-randpoort"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Nog opsies"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Maak oorloop toe"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> gekies</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> gekies</item> + </plurals> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 8165b5e..a676a3d 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ቀኖች"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ንድፍ ተጀምሯል"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ንድፍ ጸድቷል"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ሕዋስ ታክሏል"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ሕዋስ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ታክሏል"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ንድፍ ተጠናቋል"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s። ምግብር %2$d ከ%3$d።"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ንዑስ ፕሮግራም አክል"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral ወደብ"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ተጨማሪ አማራጮች"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ትርፍ ፍሰትን ዝጋ"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጧል</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጠዋል</item> + </plurals> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 3a8b02e..4d5e798 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"غيغابايت"</string> <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string> <string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> يوم"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> @@ -732,8 +733,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"بدأ النمط"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"تم محو النمط"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"تمت إضافة الخلية"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"تمت إضافة الخلية <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"اكتمل النمط"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"إضافة أداة."</string> @@ -1614,5 +1614,12 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"منفذ الأجهزة الطرفية المزودة بكابل USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"خيارات أخرى"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"إغلاق التجاوز"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="zero">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> من العناصر</item> + <item quantity="two">تم تحديد عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item> + <item quantity="few">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> عناصر</item> + <item quantity="many">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا</item> + <item quantity="other">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> من العناصر</item> + <item quantity="one">تم تحديد <xliff:g id="COUNT_0">%1$d</xliff:g> عنصر</item> + </plurals> </resources> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 7ced265..3f2e6af 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gan <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Model başlandı"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Model təmizləndi"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Xana əlavə edildi"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Xana <xliff:g id="CELL_INDEX">%1$s</xliff:g> əlavə edildi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Model tamamlandı"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Daha çox seçim"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Yüklənməni qapadın"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seçilib</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seçilib</item> + </plurals> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 216fe66..21969d0 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дни"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Фигурата е започната"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Фигурата е изчистена"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Клетката е добавена"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Добавихте точка <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Фигурата е завършена"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Приспособление %2$d от %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавяне на приспособление."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Периферен USB порт"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Още опции"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затваряне на менюто при препълване"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">Избрахте <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Избрахте <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 1aa368e..3d4d800 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> দিন"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘন্টা"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘন্টা"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"প্যাটার্ন শুরু হয়েছে"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"প্যাটার্ন সাফ করা হয়েছে"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"কক্ষ যোগ করা হযেছে"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> কক্ষ যোগ করা হয়েছে"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"প্যাটার্ন সম্পন্ন হয়েছে"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s৷ %3$d এর %2$d উইজেট৷"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"উইজেট যোগ করুন"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB পেরিফেরাল পোর্ট"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"আরো বিকল্প"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ওভারফ্লো বন্ধ করুন"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item> + </plurals> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index c0945e5..81ced84 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dies"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Patró iniciat"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patró esborrat"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"S\'ha afegit una cel·la"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"S\'ha afegit la cel·la <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patró completat"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Afegeix un widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port perifèric USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Més opcions"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tanca el menú addicional"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">Seleccionats: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Seleccionats: <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index b7fb89e..8b92c84 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Bezpečnostní gesto zahájeno"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bezpečnostní gesto vymazáno"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Buňka přidána"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Byla přidána buňka <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostní gesto dokončeno"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Přidat widget"</string> @@ -1574,12 +1574,16 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Požadavek SS byl změněn na požadavek DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Požadavek SS byl změněn na požadavek USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Požadavek SS byl změněn na nový požadavek SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Pracovní profil"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB pro periferní zařízení – Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port USB pro periferní zařízení"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Další možnosti"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zavřít rozbalovací nabídku"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="few">Vybrány <xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> + <item quantity="many">Vybráno <xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> + <item quantity="other">Vybráno <xliff:g id="COUNT_1">%1$d</xliff:g> položek</item> + <item quantity="one">Vybrána <xliff:g id="COUNT_0">%1$d</xliff:g> položka</item> + </plurals> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 3035003..af6aa5a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"Tb"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pb"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dage"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Mønster er begyndt"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Mønster er ryddet"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er tilføjet"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celle <xliff:g id="CELL_INDEX">%1$s</xliff:g> blev tilføjet"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønster er fuldført"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d af %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tilføj widget."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-port til eksterne enheder"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Flere valgmuligheder"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Luk overløb"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Der er valgt <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Der er valgt <xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 60b55a9..8e9a6ac 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> Tage"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Muster gestartet"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Muster gelöscht"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Zelle hinzugefügt"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Punkt <xliff:g id="CELL_INDEX">%1$s</xliff:g> hinzugefügt"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster abgeschlossen"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d von %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget hinzufügen"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-Port für Peripheriegeräte"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Weitere Optionen"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Überlauf schließen"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ausgewählt</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ausgewählt</item> + </plurals> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5fd19c2..8d1779c 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ημέρες"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρες"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρα"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ξεκίνησε η δημιουργία μοτίβου"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Το μοτίβο απαλείφθηκε"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Προστέθηκε κελί"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Προστέθηκε το κελί <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Το μοτίβο ολοκληρώθηκε"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Γραφικό στοιχείο %2$d από %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Προσθήκη γραφικού στοιχείου"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Περιφερειακή θύρα USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Περισσότερες επιλογές"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Κλείσιμο υπερχείλισης"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">Επιλέχτηκαν <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Επιλέχτηκε <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index d37a5de..7e89393 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pattern started"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pattern cleared"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"More options"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> + </plurals> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index d37a5de..7e89393 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pattern started"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pattern cleared"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"More options"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> + </plurals> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index d37a5de..7e89393 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pattern started"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pattern cleared"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cell added"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> added"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pattern completed"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"More options"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> + </plurals> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 11ce6db..d3a4d61 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Se inició el patrón"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Se eliminó el patrón"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se agregó una celda."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Se agregó la celda <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Se completó el patrón"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agregar widget"</string> @@ -1081,10 +1081,10 @@ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Se detectó un nuevo medio (<xliff:g id="NAME">%s</xliff:g>)."</string> <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string> - <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"El medio <xliff:g id="NAME">%s</xliff:g> está dañado"</string> - <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"El medio <xliff:g id="NAME">%s</xliff:g> está dañado. Toca la pantalla para solucionar el problema."</string> - <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"El medio <xliff:g id="NAME">%s</xliff:g> no es compatible"</string> - <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"El dispositivo no es compatible con el medio <xliff:g id="NAME">%s</xliff:g>. Toca la pantalla para configurarlo en un formato compatible."</string> + <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> está dañado"</string> + <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> está dañado. Toca la pantalla para solucionar el problema."</string> + <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no es compatible"</string> + <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"El dispositivo no es compatible con <xliff:g id="NAME">%s</xliff:g>. Toca la pantalla para configurarlo en un formato compatible."</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string> <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Para evitar que se pierdan datos, desactiva el dispositivo <xliff:g id="NAME">%s</xliff:g> antes de extraerlo."</string> <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1112,7 +1112,7 @@ <string name="ext_media_status_unsupported" msgid="4691436711745681828">"No compatible"</string> <string name="ext_media_status_ejecting" msgid="5463887263101234174">"Expulsando…"</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"Formateando…"</string> - <string name="ext_media_status_missing" msgid="5638633895221670766">"No se insertó el medio"</string> + <string name="ext_media_status_missing" msgid="5638633895221670766">"No se insertó"</string> <string name="activity_list_empty" msgid="1675388330786841066">"No se encontraron actividades coincidentes."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"Dirigir salida de medios"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que la aplicación dirija salidas de medios a otros dispositivos externos."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La solicitud SS cambió por una solicitud DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS cambió por una solicitud USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS cambió por una nueva solicitud SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Puerto USB de periféricos Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Puerto USB de periféricos"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Más opciones"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Cerrar la barra de herramientas flotante adicional"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos seleccionados</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento seleccionado</item> + </plurals> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 730fc24..baf4601 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Patrón iniciado"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patrón borrado"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se ha añadido una celda."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Se ha añadido la celda <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patrón completado"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Añadir widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Puerto periférico USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Más opciones"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Cerrar menú adicional"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seleccionados</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seleccionado</item> + </plurals> </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 32f0d94..0eb270c 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päeva"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Mustri koostamisega on alustatud"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Muster on kustutatud"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Lahter on lisatud"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Lisati lahter <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Muster on valmis"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidin %2$d/%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidina lisamine."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Väline USB-port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Rohkem valikuid"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Ületäite sulgemine"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> on valitud</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> on valitud</item> + </plurals> </resources> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 62c686a..0a2e8b3 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> egun"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Eredua marrazten hasi zara"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Eredua garbitu da"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Gelaxka gehitu da"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Gehitu da <xliff:g id="CELL_INDEX">%1$s</xliff:g> konexio zelularra"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Eredua osatu da"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d/%3$d widgeta."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Gehitu widgeta."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS eskaera DIAL eskaerara aldatu da."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS eskaera USSD eskaerara aldatu da."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS eskaera SS eskaera berrira aldatu da."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profila"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ataka periferikoa"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB ataka periferikoa"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Aukera gehiago"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Itxi gainfluxua"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> hautatuta</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> hautatuta</item> + </plurals> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 2516820..4a6e425 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"گیگابایت"</string> <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string> <string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> روز"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"الگو شروع شد"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"الگو پاک شد"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سلول اضافه شد"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"سلول <xliff:g id="CELL_INDEX">%1$s</xliff:g> اضافه شد"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"الگو تکمیل شد"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ابزارک اضافه کنید."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"درگاه جانبی USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"گزینههای بیشتر"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"بستن منوی سرریز"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد انتخاب شد</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد انتخاب شد</item> + </plurals> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index e789a78..295028e 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Gt"</string> <string name="terabyteShort" msgid="231613018159186962">"Tt"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pt"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päivää"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Kuvio aloitettu"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Kuvio tyhjennetty"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Solu lisätty"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Solu <xliff:g id="CELL_INDEX">%1$s</xliff:g> lisätty"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kuvio valmis"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d/%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lisää widget."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-pyyntö muutettiin DIAL-pyynnöksi."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-pyyntö muutettiin USSD-pyynnöksi."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-pyyntö muutettiin uudeksi SS-pyynnöksi."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Työprofiili"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidin USB-oheislaiteportti"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-oheislaiteportti"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Lisäasetukset"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Sulje ylivuoto"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valittu</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> valittu</item> + </plurals> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index c70dc56..3f4f64e 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Schéma commencé."</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Schéma effacé."</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cellule <xliff:g id="CELL_INDEX">%1$s</xliff:g> ajoutée"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La demande SS a été modifiée et est maintenant une demande DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La demande SS a été modifiée et est maintenant une demande USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La demande SS a été modifiée et est maintenant une nouvelle demande SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB de l\'appareil Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Plus d\'options"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fermer la barre d\'outils en superposition"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> + </plurals> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 95f1a72..bac4417 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Schéma commencé."</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Schéma effacé."</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Le point <xliff:g id="CELL_INDEX">%1$s</xliff:g> a bien été ajouté."</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port du périphérique USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Plus d\'options"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fermer la barre d\'outils en superposition"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> + </plurals> </resources> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index a922120..c2dcd0c 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Iniciouse o padrón"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Borrouse o padrón"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Engadiuse un móbil"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Engadiuse a cela <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Completouse o padrón"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engadir widget."</string> @@ -1081,10 +1081,10 @@ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Detectouse unha <xliff:g id="NAME">%s</xliff:g> nova"</string> <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e contidos multimedia"</string> - <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danada"</string> - <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> está danada. Toca para solucionar o problema."</string> + <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danado"</string> + <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> está danado. Toca para solucionar o problema."</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> incompatible"</string> - <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"Este dispositivo non é compatible coa <xliff:g id="NAME">%s</xliff:g>. Toca para configurala nun formato compatible."</string> + <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"Este dispositivo non é compatible con <xliff:g id="NAME">%s</xliff:g>. Toca para configuralo nun formato compatible."</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retirouse a <xliff:g id="NAME">%s</xliff:g> de forma inesperada"</string> <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva a <xliff:g id="NAME">%s</xliff:g> antes de retirala para evitar a perda de datos"</string> <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Retirouse a <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1102,13 +1102,13 @@ <string name="ext_media_move_success_message" msgid="4199002148206265426">"Migráronse os datos a <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Non se puideron migrar os datos"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Quedan datos na localización orixinal"</string> - <string name="ext_media_status_removed" msgid="6576172423185918739">"Extraída"</string> - <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsada"</string> + <string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string> + <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string> <string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando..."</string> <string name="ext_media_status_mounted" msgid="7253821726503179202">"Listo"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"Só lectura"</string> <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Extraeuse de forma non segura"</string> - <string name="ext_media_status_unmountable" msgid="805594039236667894">"Danada"</string> + <string name="ext_media_status_unmountable" msgid="805594039236667894">"Danado"</string> <string name="ext_media_status_unsupported" msgid="4691436711745681828">"Non compatible"</string> <string name="ext_media_status_ejecting" msgid="5463887263101234174">"Expulsando…"</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"Formatando…"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Porto periférico USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Máis opcións"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Pechar barra de ferramentas adicional"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">Seleccionáronse <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Seleccionouse <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 8cda6b2..8a75dbe 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> @@ -541,7 +542,7 @@ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"જરૂરી છે કે સંગ્રહિત એપ્લિકેશન એન્ક્રિપ્ટ થાય."</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"કૅમેરા અક્ષમ કરો"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"તમામ ઉપકરણ કૅમેરાનો ઉપયોગ અટકાવો."</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"કેટલીક સ્ક્રીન લૉક સુવિધાઓ અક્ષમ કરો"</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"અમુક સ્ક્રીનલૉક સુવિધા અક્ષમ કરો"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"કેટલીક સ્ક્રીન લૉક સુવિધાઓના ઉપયોગને અટકાવો."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"ઘર"</item> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"પેટર્ન શરૂ કરી"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"પેટર્ન સાફ કરી"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"કોષ ઉમેર્યો"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> કોષ ઉમેર્યો"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"પેટર્ન પૂર્ણ કરી"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d માંથી %2$d વિજેટ."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"વિજેટ ઉમેરો."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB પેરિફેરલ પોર્ટ"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"વધુ વિકલ્પો"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ઓવરફ્લો બંધ કરો"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item> + </plurals> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index e04043c..90ac653 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटे"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटा"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"आकार प्रारंभ किया गया"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"आकार साफ़ किया गया"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"कक्ष जोड़ा गया"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"सेल <xliff:g id="CELL_INDEX">%1$s</xliff:g> जोड़ा गया"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"आकार पूरा किया गया"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d विजेट में से %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोड़ें"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB पेरिफ़ेरल पोर्ट"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"अधिक विकल्प"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओवरफ़्लो बंद करें"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item> + </plurals> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index bc94929..7ada3f0 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -729,8 +730,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Uzorak se pokrenuo"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Uzorak je obrisan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodan je mobitel"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodana je ćelija <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Uzorak je dovršen"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d od %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodavanje widgeta."</string> @@ -1557,12 +1557,15 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS zahtjev izmijenjen je u DIAL zahtjev."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev izmijenjen je u USSD zahtjev."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev izmijenjen je u novi SS zahtjev."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Radni profil"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidov USB priključak za periferne uređaje"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB priključak za periferne uređaje"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Više opcija"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvori dodatni izbornik"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrana</item> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrane</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> odabranih</item> + </plurals> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 373df18..70f006e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> nap"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Minta elindítva"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Minta törölve"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella hozzáadva"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>. pont hozzáadva"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Minta befejezve"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %3$d/%2$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Modul hozzáadása."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-perifériaport"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"További lehetőségek"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"További elemeket tartalmazó eszköztár bezárása"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kiválasztva</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kiválasztva</item> + </plurals> </resources> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index b9172d4..806d70a 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ԳԲ"</string> <string name="terabyteShort" msgid="231613018159186962">"Տբ"</string> <string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> օր"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Սխեմայի հավաքումը սկսված է"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Սխեման մաքրված է"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ավելացվել է վանդակ"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> դասիչով բջիջը ավելացված է"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Սխեմայի հավաքումն ավարտված է"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Վիջեթ %2$d of %3$d:"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ավելացնել վիջեթ:"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB արտաքին միացք"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Այլ ընտրանքներ"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Փակել ավելորդ տեղեկությունները"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index cbb7f47..ffbf564 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pola dimulai"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pola dihapus"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pola selesai"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambahkan widget."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port Periferal USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Opsi lainnya"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tutup luapan"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item> + </plurals> </resources> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 6d76523..cfc3ea4 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Mynstur hafið"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Mynstur hreinsað"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Hólfi bætt við"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Hólfi <xliff:g id="CELL_INDEX">%1$s</xliff:g> bætt við"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mynstur teiknað"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Græja %2$d af %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Bæta græju við."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-beiðni er breytt í DIAL-beiðni."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-beiðni er breytt í USSD-beiðni."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-beiðni er breytt í nýja SS-beiðni."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Vinnusnið"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB-tengi fyrir jaðartæki"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-tengi fyrir jaðartæki"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Fleiri valkostir"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Loka viðbótaratriðum"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> valið</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valin</item> + </plurals> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index bdc609a..3e18bcd 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> giorni"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ore"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ora"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Sequenza iniziata"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Sequenza cancellata"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cella aggiunta"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"È stata aggiunta la cella <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequenza completata"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d di %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Aggiungi widget."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Porta periferica USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Altre opzioni"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Chiudi overflow"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elemento selezionato</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elementi selezionati</item> + </plurals> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 00b4029..1e3f8cd 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ימים"</string> <string name="durationDayHours" msgid="2713107458736744435">"יום <xliff:g id="DAYS">%1$d</xliff:g> <xliff:g id="HOURS">%2$d</xliff:g> שע\'"</string> <string name="durationDayHour" msgid="7293789639090958917">"יום <xliff:g id="DAYS">%1$d</xliff:g> שעה <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -252,13 +253,13 @@ <string name="permgroupdesc_phone" msgid="6234224354060641055">"התקשרות וניהול של שיחות טלפון"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"חיישנים"</string> <string name="permgroupdesc_sensors" msgid="2280821510554029577">"גישה אל מידע על הסימנים החיוניים והפעילות הגופנית שלך"</string> - <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"לאחזר תוכן של חלון"</string> + <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזור תוכן של חלון"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string> - <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"להפעיל את \'גילוי באמצעות מגע\'"</string> + <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string> <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"פריטים שנגעת בהם ייאמרו בקול וניתן לנווט במסך באמצעות תנועות."</string> <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"להפעיל גישה משופרת לאינטרנט"</string> <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ייתכן שסקריפטים יותקנו על מנת להקל את הגישה אל תוכן של אפליקציות."</string> - <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"להציג טקסט בזמן הקלדה"</string> + <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"הצגת טקסט בזמן הקלדה"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"כולל נתונים אישיים כמו מספרי כרטיס אשראי וסיסמאות."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"השבת או שנה את שורת המצב"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"מאפשר לאפליקציה להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת."</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"יצירת התבנית החלה"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"התבנית נמחקה"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"התא נוסף"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"תא <xliff:g id="CELL_INDEX">%1$s</xliff:g> נוסף"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"התבנית הושלמה"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</string> @@ -1580,5 +1580,10 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"יציאת USB בציוד היקפי"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"אפשרויות נוספות"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"סגור את האפשרויות הנוספות"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="two">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="many">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">בחרת <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 3f2374b..009f4f0 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>日"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"パターンの描画を開始しました"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"パターンを消去しました"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"セルを追加しました"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"セル<xliff:g id="CELL_INDEX">%1$s</xliff:g>を追加しました"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"パターンの描画が完了しました"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。ウィジェット%2$d/%3$d。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ウィジェットを追加します。"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SSリクエストはDIALリクエストに変更されました。"</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SSリクエストはUSSDリクエストに変更されました。"</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SSリクエストは新しいSSリクエストに変更されました。"</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"仕事用プロファイル"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB周辺機器ポート"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB周辺機器ポート"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"その他のオプション"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"オーバーフローを閉じる"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個を選択中</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個を選択中</item> + </plurals> </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index e8a3905..0224308 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"გბაიტი"</string> <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> დღე"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ნიმუშის შექმნა დაწყებულია"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ნიმუში წაიშალა"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"უჯრედი დაემატა."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"უჯრედი <xliff:g id="CELL_INDEX">%1$s</xliff:g> დამატებულია"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ნიმუშის შექმნა დასრულებულია"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დამატება"</string> @@ -1102,8 +1102,8 @@ <string name="ext_media_move_success_message" msgid="4199002148206265426">"მონაცემები გადატანილი იქნა <xliff:g id="NAME">%s</xliff:g>-ში"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"მონაცემების გადატანა ვერ მოხერხდა"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"მონაცემები დარჩა თავდაპირველ მდებარეობაში"</string> - <string name="ext_media_status_removed" msgid="6576172423185918739">"ამოიშალა"</string> - <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ამოღებულია"</string> + <string name="ext_media_status_removed" msgid="6576172423185918739">"ამოღებულია"</string> + <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ჩახსნილია სისტემიდან"</string> <string name="ext_media_status_checking" msgid="6193921557423194949">"შემოწმება..."</string> <string name="ext_media_status_mounted" msgid="7253821726503179202">"მზად არის"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"მხოლოდ კითხვა"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS მოთხოვნა შეიცვალა DIAL მოთხოვნით."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS მოთხოვნა შეიცვალა ახალი SS მოთხოვნით."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"სამსახურის პროფილი"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android-ის პერიფერიული USB პორტი"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"პერიფერიული USB პორტი"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"სხვა ვარიანტები"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"გადავსების დახურვა"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> შერჩეული</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> შერჩეული</item> + </plurals> </resources> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 1f682cd..f2d15fe 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> @@ -249,7 +250,7 @@ <string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"қоңырау шалу және телефон қоңырауларын басқару"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"Сенсорлар"</string> - <string name="permgroupdesc_sensors" msgid="2280821510554029577">"өмірлік белгілер мен дене белсенділігі туралы ақпаратқа қол жеткізу"</string> + <string name="permgroupdesc_sensors" msgid="2280821510554029577">"ағза күйінің көрсеткіштері мен дене белсенділігі туралы ақпаратқа қол жеткізу"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмұнын оқып отыру."</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Түртілген элементтерді дыбыстау функциясын қосу"</string> @@ -541,8 +542,8 @@ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Сақталған қолданба деректерінің кодталуын қажет етеді."</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"Камераларды өшіру"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Құрылғыдағы барлық камералар қолданысын бөгеу."</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Кейбір экран бекітпесі мүмк-тері өшіріледі"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Кейбір экран бекітпесінің мүмкіндіктерін пайдалануға тыйым салынады."</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Экран құлпы функцияларын өшіру"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Кейбір экранды құлыптау мүмкіндіктерін пайдалануға тыйым салынады."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Үй"</item> <item msgid="869923650527136615">"Ұялы тел."</item> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Кескін басталды"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Кескін өшірілді"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Тор қосылды"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> ұяшығы қосылды"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Кескін аяқталды"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d виджет, барлығы %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет қосу."</string> @@ -1102,15 +1102,15 @@ <string name="ext_media_move_success_message" msgid="4199002148206265426">"Деректер <xliff:g id="NAME">%s</xliff:g> ішіне тасымалданды"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Деректерді тасымалдау мүмкін емес"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Деректер бастапқы орнында қалды"</string> - <string name="ext_media_status_removed" msgid="6576172423185918739">"Алып тасталды"</string> - <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Шығарып алынды"</string> + <string name="ext_media_status_removed" msgid="6576172423185918739">"Алынды"</string> + <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ажыратылды"</string> <string name="ext_media_status_checking" msgid="6193921557423194949">"Тексерілуде…"</string> <string name="ext_media_status_mounted" msgid="7253821726503179202">"Дайын"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"Тек оқуға арналған"</string> - <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Қауіпсіз алынбады"</string> + <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Қауіпсіз түрде алынды"</string> <string name="ext_media_status_unmountable" msgid="805594039236667894">"Бүлінген"</string> <string name="ext_media_status_unsupported" msgid="4691436711745681828">"Қолданылмайды"</string> - <string name="ext_media_status_ejecting" msgid="5463887263101234174">"Шығарылуда..."</string> + <string name="ext_media_status_ejecting" msgid="5463887263101234174">"Ажыратылуда..."</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"Пішімделуде..."</string> <string name="ext_media_status_missing" msgid="5638633895221670766">"Салынбады"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Сәйкес әрекеттер табылмады."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB перифериялық порты"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Қосымша опциялар"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Артық толуды жабу"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> таңдалды</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> таңдалды</item> + </plurals> </resources> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 61dabb7..e9c2a05 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ជីកាបៃ"</string> <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"បានចាប់ផ្ដើមលំនាំ"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"បានសម្អាតលំនាំ"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"បានបន្ថែមក្រឡា"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"បានបន្ថែមក្រឡាទី <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"បានបញ្ចប់លំនាំ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ធាតុក្រាហ្វិក %2$d នៃ %3$d ។"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ថែមធាតុក្រាហ្វិក។"</string> @@ -1548,5 +1548,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"ឧបករណ៍រន្ធ USB បន្ថែម"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ជម្រើសច្រើនទៀត"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"បិទលើសចំណុះ"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">បានជ្រើស <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">បានជ្រើស <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index d9e600d..9b7e4a9 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನಗಳು"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂಟೆಗಳು"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ಪ್ಯಾಟರ್ನ್ ಪ್ರಾರಂಭವಾಗಿದೆ"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ಪ್ಯಾಟರ್ನ್ ಅಳಿಸಲಾಗಿದೆ"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ಸೆಲ್ ಸೇರಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> ಸೆಲ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ಪ್ಯಾಟರ್ನ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s.%3$d ರಲ್ಲಿ %2$d ವಿಜೆಟ್."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ವಿಜೆಟ್ ಸೇರಿಸು."</string> @@ -1084,7 +1084,7 @@ <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ"</string> <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ. ಸರಿಪಡಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ಬೆಂಬಲಿಸದಿರುವ <xliff:g id="NAME">%s</xliff:g>"</string> - <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"ಈ ಸಾಧನವು <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮೆಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> + <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"ಈ ಸಾಧನವು <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ಅನಿರೀಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ಡೇಟಾ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ <xliff:g id="NAME">%s</xliff:g> ಅಳವಡಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string> <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> @@ -1540,11 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ವಿನಂತಿಯನ್ನು DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ವಿನಂತಿಯನ್ನು ಹೊಸ SS ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string> - <string name="notification_work_profile_content_description" msgid="4600554564103770764">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ಪೆರಿಪೆರಲ್ ಪೋರ್ಟ್"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB ಪೆರಿಪೆರಲ್ ಪೋರ್ಟ್"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ಓವರ್ಫ್ಲೋ ಮುಚ್ಚು"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item> + </plurals> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 38dc569..471da5f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>일"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"패턴 시작"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"패턴 삭제"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"셀 추가됨"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"셀 <xliff:g id="CELL_INDEX">%1$s</xliff:g> 추가됨"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d의 위젯 %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"위젯 추가"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 요청이 DIAL 요청으로 수정됩니다."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 요청이 USSD 요청으로 수정됩니다."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 요청이 새로운 SS 요청으로 수정됩니다."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"직장 프로필"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 주변기기 포트"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB 주변기기 포트"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"옵션 더보기"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"오버플로우 닫기"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>개 선택됨</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>개 선택됨</item> + </plurals> </resources> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 62f73c4..7076ee0 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -32,7 +32,8 @@ <skip /> <!-- no translation found for petabyteShort (5637816680144990219) --> <skip /> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> @@ -683,8 +684,8 @@ <!-- no translation found for policylab_disableCamera (6395301023152297826) --> <skip /> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Түзмөктүн бардык камераларын колдонууга тыюу салуу."</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Экрн клпснн айрм өзгчлктрн өчр"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Экран кулпусунун айрым өзгөчөлүктөрүн колдонуунун алдын алуу."</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Экрн клпснн айрм функцялрн өчр"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Экранды кулпулоо функцияларынын айрымдарын колдонууга тыюу салуу"</string> <!-- no translation found for phoneTypes:0 (8901098336658710359) --> <!-- no translation found for phoneTypes:1 (869923650527136615) --> <!-- no translation found for phoneTypes:2 (7897544654242874543) --> @@ -954,8 +955,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Үлгү башталды"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Үлгү тазаланды"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Уяча кошулду"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> уячасы кошулду"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Үлгү аягына чыкты"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ичинен %2$d виджет."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет кошуу."</string> @@ -1310,7 +1310,7 @@ <string name="network_available_sign_in" msgid="1848877297365446605">"Тармакка кирүү"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> <skip /> - <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi тармагынын Интернетке мүмкүнчүлүгү жок"</string> + <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi тармагы Интернетке туташпай турат"</string> <string name="wifi_no_internet_detailed" msgid="7593858887662270131">"Параметрлер үчүн тийип коюңуз"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi менен туташуу түзүлбөдү"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" хотспотунун интернет байланышы начар."</string> @@ -1453,17 +1453,17 @@ <string name="ext_media_move_success_message" msgid="4199002148206265426">"Дайындар <xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулду"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Дайындар ооштурулбай калды"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Дайындар баштапкы ордунда калды"</string> - <string name="ext_media_status_removed" msgid="6576172423185918739">"Алынып салынган"</string> + <string name="ext_media_status_removed" msgid="6576172423185918739">"Өчүрүлдү"</string> <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Чыгарылган"</string> <string name="ext_media_status_checking" msgid="6193921557423194949">"Текшерилүүдө…"</string> <string name="ext_media_status_mounted" msgid="7253821726503179202">"Даяр"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"Окуу үчүн гана"</string> - <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Коопсуз алынган жок"</string> + <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Коопсуз өчүрүлгөн жок"</string> <string name="ext_media_status_unmountable" msgid="805594039236667894">"Бузулган"</string> <string name="ext_media_status_unsupported" msgid="4691436711745681828">"Колдоого алынбайт"</string> <string name="ext_media_status_ejecting" msgid="5463887263101234174">"Чыгарылууда…"</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"Форматталууда…"</string> - <string name="ext_media_status_missing" msgid="5638633895221670766">"Салынган жок"</string> + <string name="ext_media_status_missing" msgid="5638633895221670766">"Сайылган жок"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Туура келген аракеттер табылбады."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа чыгарылышын багыттоо"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"Колдонмого медиа мазмунду башка тышкы түзмөктөргө багыттоо уруксатын берет."</string> @@ -1962,5 +1962,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Сырткы оюкча"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Дагы параметрлер"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Ашып-ташууну жабуу"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> тандалды</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> тандалды</item> + </plurals> </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index c5c93a9..a0384c2 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ຮູບແບບເລີ່ມຕົ້ນແລ້ວ"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ລຶບລ້າງຮູບແບບແລ້ວ"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ຕາລາງຖືກເພີ່ມແລ້ວ"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ເພີ່ມ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ເຊລເຂົ້າແລ້ວ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ຮູບແບບສຳເລັດແລ້ວ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາກທັງໝົດ %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"ຜອດຮອບນອກ USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ໂຕເລືອກເພີ່ມເຕີມ"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ປິດການໄຫຼລົ້ນອອກມາ"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ຖືກເລືອກແລ້ວ</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ຖືກເລືອກແລ້ວ</item> + </plurals> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3f54a65..f5d35d3 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> @@ -251,7 +252,7 @@ <string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonas"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"skambinti ir tvarkyti telefonų skambučius"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"Jutikliai"</string> - <string name="permgroupdesc_sensors" msgid="2280821510554029577">"pasiekti informaciją apie jūsų gyvybinius simptomus ir fizinę veiklą"</string> + <string name="permgroupdesc_sensors" msgid="2280821510554029577">"pasiekti informaciją apie jūsų gyvybinius ženklus ir fizinę veiklą"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Gauti lango turinį"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Šablonas pradėtas"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Šablonas išvalytas"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Pridėtas langelis"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Pridėtas <xliff:g id="CELL_INDEX">%1$s</xliff:g> taškas"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Šablonas užbaigtas"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d valdiklis iš %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridėti valdiklį."</string> @@ -1580,5 +1580,10 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB išorinis prievadas"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Daugiau parinkčių"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Uždaryti perpildymo sritį"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Pasirinktas <xliff:g id="COUNT_1">%1$d</xliff:g> elementas</item> + <item quantity="few">Pasirinkti <xliff:g id="COUNT_1">%1$d</xliff:g> elementai</item> + <item quantity="many">Pasirinkta <xliff:g id="COUNT_1">%1$d</xliff:g> elemento</item> + <item quantity="other">Pasirinkta <xliff:g id="COUNT_1">%1$d</xliff:g> elementų</item> + </plurals> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 41b085d..9e4cd5f 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -729,8 +730,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Kombinācija uzsākta"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Kombinācija notīrīta"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Šūna pievienota"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Pievienota <xliff:g id="CELL_INDEX">%1$s</xliff:g>. šūna"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Kombinācija pabeigta"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d. logrīks no %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pievienot logrīku."</string> @@ -1557,12 +1557,15 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS pieprasījums ir mainīts uz DIAL pieprasījumu."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS pieprasījums ir mainīts uz USSD pieprasījumu."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS pieprasījums ir mainīts uz jaunu SS pieprasījumu."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Darba profils"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB perifērijas ports"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB perifērijas ports"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Citas opcijas"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Aizvērt pārpildes izvēlni"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīts</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item> + </plurals> </resources> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index d029d29..25d9264 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дена"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Шемата е започната"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Шемата е исчистена"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Додадена е ќелија"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додадена е ќелија <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Шемата е целосна"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string> @@ -1548,5 +1548,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Надворешна порта на УСБ"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Повеќе опции"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затвори прелевање"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> е избрана</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> се избрани</item> + </plurals> </resources> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 59e9e15..7b73a48 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"പാറ്റേൺ ആരംഭിച്ചു"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"പാറ്റേൺ മായ്ച്ചു"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"സെൽ ചേർത്തു"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"കളം <xliff:g id="CELL_INDEX">%1$s</xliff:g> ചേർത്തു"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"പാറ്റേൺ പൂർത്തിയാക്കി"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. വിജറ്റ് %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"വിജറ്റ് ചേർക്കുക."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB പെരിഫറൽ പോർട്ട്"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"കൂടുതല് ഓപ്ഷനുകള്"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ഓവർഫ്ലോ അടയ്ക്കുക"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item> + </plurals> </resources> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 80658ca..42b8902 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Хээ эхэлж байна"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Хээ цэвэрлэгдэв"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Нүд нэмэгдсэн"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> нүд нэмсэн"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Хээ дуусав"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нэмэх."</string> @@ -1544,5 +1544,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Нэмэлт сонголтууд"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Илүү цонхнуудыг хаах"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> сонгосон</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> сонгосон</item> + </plurals> </resources> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 3b72ff4..80a1d61 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"नमुना प्रारंभ झाला"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"नमुना साफ केला"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल जोडला"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> सेल जोडला"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"नमुना पूर्ण केला"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d पैकी %2$d विजेट."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोडा."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB परिधीय पोर्ट"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"अधिक पर्याय"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओव्हरफ्लो बंद करा"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडला</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडले</item> + </plurals> </resources> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 5d34bfd..60685c4 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> @@ -541,7 +542,7 @@ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Memerlukan data apl yang disimpan itu disulitkan."</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"Lumpuhkan kamera"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Menghalang penggunaan semua kamera peranti."</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Lumpuhkan sesetengah ciri kunci skrin"</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Lumpuhkan beberapa ciri kunci skrin"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Halang penggunaan sesetengah ciri kunci skrin."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Laman Utama"</item> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Corak dimulakan"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Corak dipadamkan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Sel <xliff:g id="CELL_INDEX">%1$s</xliff:g> ditambahkan"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Corak siap"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambah widget."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Permintaan SS diubah kepada permintaan DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah kepada permintaan USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah kepada permintaan SS baharu."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port Persisian USB Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port Persisian USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Lagi pilihan"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tutup limpahan"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item> + </plurals> </resources> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index db63760..3885d976 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ရက် <xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်<xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ပုံစံစတင်ခြင်း"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ပုံစံရှင်းလင်းခြင်း"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"အကွက်တိုးခြင်း"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ဆဲလ် <xliff:g id="CELL_INDEX">%1$s</xliff:g> ပေါင်းထည့်ပြီးပါပြီ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ပုံစံပြီးဆုံးခြင်း"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ရဲ့ဝဒ်ဂျက် %2$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ဝဒ်ဂျက်ထည့်ရန်"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB ဘေးရှိပို့တ်"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"နောက်ထပ် ရွေးစရာများ"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ကိရိယာဘားအပိုအား ပိတ်ရန်"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item> + </plurals> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 75e22df..77880d8 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dager"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Mønsteret er påbegynt"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Mønsteret er slettet"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celle er lagt til"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celle <xliff:g id="CELL_INDEX">%1$s</xliff:g> er lagt til"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Mønsteret er fullført"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %2$d av %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Legg til modul."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-forespørselen er endret til en RINGE-forespørsel."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-forespørselen er endret til en USSD-forespørsel."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-forespørselen er endret til en ny SS-forespørsel."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeidsprofil"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port for USB-tilleggsutstyr for Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port for USB-tilleggsutstyr"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Flere alternativer"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Lukk overflytsmenyen"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> er valgt</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> er valgt</item> + </plurals> </resources> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index f8086ca..04dc806 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> @@ -249,7 +250,7 @@ <string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"सेन्सरहरू"</string> - <string name="permgroupdesc_sensors" msgid="2280821510554029577">"तपाईँको अत्यावश्यक संकेत र शारीरिक गतिविधि बारे जानकारी पहुँच गर्नुहोस्"</string> + <string name="permgroupdesc_sensors" msgid="2280821510554029577">"तपाईँको महत्त्वपूर्ण संकेत र शारीरिक गतिविधिबारे जानकारीको पहुँच गर्नुहोस्"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string> @@ -541,8 +542,8 @@ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"भण्डार गरिएको डेटा इन्क्रिप्ट हुनु आवश्यक छ।"</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"क्यामेरालाई असक्षम गराउनुहोस्"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"सबै उपकरण क्यामराहरूको प्रयोग रोक्नुहोस्"</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"स्क्रीन लकका केही सुविधाहरू निष्क्रिय गर्नुहोस्"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"स्क्रीन लक केही सुविधाहरूको प्रयोगमा रोक लगाउनुहोस्।"</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"केही स्क्रिन लकका सुविधाहरू अक्षम गर्नुहोस्"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"केही स्क्रिन लक सुविधाहरूको प्रयोगमा रोक लगाउनुहोस्।"</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"गृह"</item> <item msgid="869923650527136615">"मोबाइल"</item> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ढाँचा सुरु भयो"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ढाँचा हटाइएको"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"सेल थप गरियो"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"कक्ष <xliff:g id="CELL_INDEX">%1$s</xliff:g> थपियो"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ढाँचा पुरा भयो"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गर्नुहोस्।"</string> @@ -1087,8 +1087,8 @@ <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नयाँ <xliff:g id="NAME">%s</xliff:g> भेटियो"</string> <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"तस्बिरहरू र मिडिया स्थानान्तरणका लागि"</string> - <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"खराब <xliff:g id="NAME">%s</xliff:g>"</string> - <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> खराब छ। समाधान गर्न छुनुहोस्।"</string> + <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"बिग्रेको <xliff:g id="NAME">%s</xliff:g>"</string> + <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> बिग्रेको छ। समाधान गर्न छुनुहोस्।"</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"यो यन्त्रले यो <xliff:g id="NAME">%s</xliff:g> समर्थन गर्दैन। समर्थित ढाँचामा सेट गर्न छुनुहोस्।"</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूपमा निकालियो"</string> @@ -1114,7 +1114,7 @@ <string name="ext_media_status_mounted" msgid="7253821726503179202">"तयार"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"पढ्नका लागि मात्र"</string> <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"असुरक्षित रुपले हटाइयो"</string> - <string name="ext_media_status_unmountable" msgid="805594039236667894">"खराब"</string> + <string name="ext_media_status_unmountable" msgid="805594039236667894">"बिग्रेको"</string> <string name="ext_media_status_unsupported" msgid="4691436711745681828">"असमर्थित"</string> <string name="ext_media_status_ejecting" msgid="5463887263101234174">"निकाल्दै..."</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"फरम्याट गर्दै…"</string> @@ -1552,5 +1552,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB पेरिफेरल पोर्ट"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"थप विकल्पहरू"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओभरफ्लो बन्द गर्नुहोस्"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयन गरियो</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> चयन गरियो</item> + </plurals> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 81a8209..28d86c8 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagen"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Patroon gestart"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Patroon gewist"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cel toegevoegd"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cel <xliff:g id="CELL_INDEX">%1$s</xliff:g> toegevoegd"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Patroon voltooid"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d van %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget toevoegen."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Poort voor USB-randapparatuur"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Meer opties"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Overloop sluiten"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> geselecteerd</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> geselecteerd</item> + </plurals> </resources> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index c052266..8ce1a9b 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟੇ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟਾ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ਪੈਟਰਨ ਚਾਲੂ ਕੀਤਾ"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ਪੈਟਰਨ ਹਟਾਇਆ ਗਿਆ"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"ਸੈਲ ਜੋੜਿਆ ਗਿਆ"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"ਸੈਲ <xliff:g id="CELL_INDEX">%1$s</xliff:g> ਜੋੜਿਆ ਗਿਆ"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"ਪੈਟਰਨ ਪੂਰਾ ਕੀਤਾ"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s। %3$d ਦਾ ਵਿਜੇਟ %2$d।"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ਵਿਜੇਟ ਜੋੜੋ।"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB ਪੈਰੀਫੈਰਲ ਪੋਰਟ"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ਹੋਰ ਚੋਣਾਂ"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ਓਵਰਫਲੋ ਬੰਦ ਕਰੋ"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item> + </plurals> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d8f93d9..1737626 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dni"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Wzór rozpoczęty"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Wzór wyczyszczony"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodano komórkę."</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodano komórkę <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Wzór ukończony"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widżet %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodaj widżet."</string> @@ -1580,5 +1580,10 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port peryferyjny USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Więcej opcji"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zamknij rozszerzony pasek"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="few">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="many">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Wybrano <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 062ba59..7ec15e3 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Sequência iniciada"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Sequência apagada"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Célula <xliff:g id="CELL_INDEX">%1$s</xliff:g> adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Sequência concluída"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget."</string> @@ -1109,7 +1109,7 @@ <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"Só de leitura"</string> <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"Removido de forma não segura"</string> <string name="ext_media_status_unmountable" msgid="805594039236667894">"Danificado"</string> - <string name="ext_media_status_unsupported" msgid="4691436711745681828">"Não suportado"</string> + <string name="ext_media_status_unsupported" msgid="4691436711745681828">"Incompatível"</string> <string name="ext_media_status_ejecting" msgid="5463887263101234174">"A ejetar…"</string> <string name="ext_media_status_formatting" msgid="1085079556538644861">"A formatar..."</string> <string name="ext_media_status_missing" msgid="5638633895221670766">"Não inserido"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Porta periférica USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Mais opções"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fechar excesso"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item> + </plurals> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 79f695a..a4e93ad 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Padrão iniciado"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Padrão apagado"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Célula adicionada"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Célula <xliff:g id="CELL_INDEX">%1$s</xliff:g> adicionada"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Padrão concluído"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitação SS foi modificada para a solicitação DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta USB periférica Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Porta USB periférica"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Mais opções"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fechar barra flutuante"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> + </plurals> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 4b4f953..b2031c6 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TO"</string> <string name="petabyteShort" msgid="5637816680144990219">"PO"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (de) zile"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> zile <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> zi <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -729,8 +730,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Desenarea modelului a început"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Modelul a fost şters"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celulă adăugată"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Celula <xliff:g id="CELL_INDEX">%1$s</xliff:g> a fost adăugată"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modelul a fost desenat"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d din %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adăugaţi un widget."</string> @@ -1557,12 +1557,15 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Solicitarea SS este modificată într-o solicitare DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Solicitarea SS este modificată într-o solicitare USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Solicitarea SS este modificată într-o nouă solicitare SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil de serviciu"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB Android periferic"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port USB periferic"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Mai multe opțiuni"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Închideți meniul suplimentar"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selectat</item> + </plurals> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 90fbeb6..58ffa3b 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string> <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> @@ -237,11 +238,9 @@ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string> <string name="permgroupdesc_calendar" msgid="3889615280211184106">"доступ к календарю"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> - <!-- no translation found for permgroupdesc_sms (4656988620100940350) --> - <skip /> + <string name="permgroupdesc_sms" msgid="4656988620100940350">"отправка и просмотр SMS-сообщений"</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"Память"</string> - <!-- no translation found for permgroupdesc_storage (637758554581589203) --> - <skip /> + <string name="permgroupdesc_storage" msgid="637758554581589203">"доступ к фотографиям, файлам и мультимедийному контенту на вашем устройстве"</string> <string name="permgrouplab_dictionary" msgid="8114410334955871144">"Пользовательский словарь"</string> <string name="permgroupdesc_dictionary" msgid="7586787746354378335">"Чтение слов в пользовательском словаре или их запись."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладки и история"</string> @@ -253,8 +252,7 @@ <string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"осуществление телефонных звонков и управление ими"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"Датчики"</string> - <!-- no translation found for permgroupdesc_sensors (2280821510554029577) --> - <skip /> + <string name="permgroupdesc_sensors" msgid="2280821510554029577">"доступ к основным показателям состояния организма и сведениям о физической активности"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать аудиоподсказки"</string> @@ -733,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ввод графического ключа"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Графический ключ сброшен"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ячейка добавлена"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Ячейка <xliff:g id="CELL_INDEX">%1$s</xliff:g> добавлена"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Графический ключ введен"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виджет %2$d из %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавить виджет"</string> @@ -1577,12 +1574,16 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-запрос преобразован в DIAL-запрос."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-запрос преобразован в USSD-запрос."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-запрос преобразован в новый SS-запрос."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Рабочий профиль"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Внешний USB-порт Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Внешний USB-порт"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Ещё"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Закрыть дополнительное меню"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="few">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="many">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index c2abf67..58cb2ea 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"දින <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> <string name="durationDayHour" msgid="7293789639090958917">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"රටාව අරඹන ලදි"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"රටාව හිස් කරන ලදි"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"කොටුවක් එකතු කරන ලදි"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> කොටුව එකතු කරන ලදි"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"රටාව සම්පූර්ණයි"</string> <!-- String.format failed for translation --> <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) --> @@ -1548,5 +1548,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB පර්යන්ත තොට"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"තවත් විකල්ප"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ඉතිරී යාම වසන්න"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item> + </plurals> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index f7c9bea..124bef9 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Bezpečnostný vzor bol začatý"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bezpečnostný vzor bol vymazaný"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Bunka bola pridaná"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Bola pridaná bunka <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostný vzor bol dokončený"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikácia %2$d z %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridať miniaplikáciu."</string> @@ -1580,5 +1580,10 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port USB pre periférne zariadenia"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Ďalšie možnosti"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvoriť rozbaľovaciu ponuku"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="few">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="many">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Vybrané: <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index f17b0d1..efcdee9 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"Št. dni: <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Vzorec se je začel"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Vzorec je izbrisan"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celica je dodana"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Dodana <xliff:g id="CELL_INDEX">%1$s</xliff:g>. celica"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Vzorec je končan"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Pripomoček %2$d za %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodajanje pripomočka."</string> @@ -1574,12 +1574,16 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Zahteva SS je spremenjena v zahtevo DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Zahteva SS je spremenjena v zahtevo USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Zahteva SS je spremenjena v novo zahtevo SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Delovni profil"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Vrata USB za dodatno opremo za Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Vrata USB za dodatno opremo"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Več možnosti"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zapri presežni element"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> izbran</item> + <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrana</item> + <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrani</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> izbranih</item> + </plurals> </resources> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 358195a..26dee97 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"terabajt"</string> <string name="petabyteShort" msgid="5637816680144990219">"petabajt"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ditë"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Motivi filloi"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Modeli u pastrua"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Qeliza u shtua"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Qeliza <xliff:g id="CELL_INDEX">%1$s</xliff:g> u shtua"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modeli përfundoi"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikacioni %2$d nga %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Shto miniaplikacion."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Porta periferike USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Opsione të tjera"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Mbylle tejkalimin"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> të zgjedhura</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> i zgjedhur</item> + </plurals> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index aaab856..e2209e6 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дана"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> @@ -729,8 +730,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Образац је започет"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Образац је обрисан"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ћелија је додата"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Ћелија <xliff:g id="CELL_INDEX">%1$s</xliff:g> је додата"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Образац је довршен"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string> @@ -1557,12 +1557,15 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS захтев је промењен у DIAL захтев."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS захтев је промењен у USSD захтев."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS захтев је промењен у нови SS захтев."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Профил за Work"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB порт за периферијске уређаје"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB порт за периферијске уређаје"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Још опција"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затвори преклопни мени"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Изабрана је <xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item> + <item quantity="few">Изабране су <xliff:g id="COUNT_1">%1$d</xliff:g> ставке</item> + <item quantity="other">Изабрано је <xliff:g id="COUNT_1">%1$d</xliff:g> ставки</item> + </plurals> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index df60005..3f7de17 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Skriver grafiskt lösenord"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Grafiskt lösenord har tagits bort"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"En cell har lagts till"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cell <xliff:g id="CELL_INDEX">%1$s</xliff:g> har lagts till"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Grafiskt lösenord har slutförts"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d av %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lägg till en widget."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB-port för kringutrustning"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Fler alternativ"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Dölj utökat verktygsfält"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> har valts</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> har valts</item> + </plurals> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 11638ac..1dd01bc 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"Siku <xliff:g id="DAYS">%1$d</xliff:g>"</string> <string name="durationDayHours" msgid="2713107458736744435">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> <string name="durationDayHour" msgid="7293789639090958917">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ruwaza imeanzishwa"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ruwaza imefutwa"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kiini kimeongezwa"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Kisanduku <xliff:g id="CELL_INDEX">%1$s</xliff:g> kimeongezwa"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Ruwaza imekamilika"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Wijeti %2$d ya %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wijeti."</string> @@ -1542,12 +1542,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Ombi la SS limerekebishwa na kuwa ombi la DIAL."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ombi la SS limerekebishwa na kuwa ombi la USSD."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ombi la SS limerekebishwa na kuwa ombi jipya la SS."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Wasifu wa kazini"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Mlango wa USB wa Pembeni wa Android"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Mlango wa USB wa Pembeni"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Chaguo zaidi"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Funga vipengee vya ziada"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> vimechaguliwa</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kimechaguliwa</item> + </plurals> </resources> diff --git a/core/res/res/values-sw600dp/dimens.xml b/core/res/res/values-sw600dp/dimens.xml index c0d9995..94e9c4e 100644 --- a/core/res/res/values-sw600dp/dimens.xml +++ b/core/res/res/values-sw600dp/dimens.xml @@ -115,4 +115,6 @@ <!-- width of ImmersiveModeConfirmation (-1 for match_parent) --> <dimen name="immersive_mode_cling_width">380dp</dimen> + + <dimen name="floating_toolbar_preferred_width">544dp</dimen> </resources> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index f8191c4..1140cc1 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"ஜி.பை."</string> <string name="terabyteShort" msgid="231613018159186962">"டெ.பை."</string> <string name="petabyteShort" msgid="5637816680144990219">"பெ.பை."</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> நாட்கள்"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"வடிவம் தொடங்கியது"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"வடிவம் அழிக்கப்பட்டது"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"கலம் சேர்க்கப்பட்டது"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"கலம் <xliff:g id="CELL_INDEX">%1$s</xliff:g> சேர்க்கப்பட்டது"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"வடிவம் நிறைவடைந்தது"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. விட்ஜெட் %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"விட்ஜெட்டைச் சேர்க்கவும்."</string> @@ -983,7 +983,7 @@ <string name="network_available_sign_in" msgid="1848877297365446605">"நெட்வொர்க்கில் உள்நுழையவும்"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> <skip /> - <string name="wifi_no_internet" msgid="8451173622563841546">"வைஃபையில் இணைய அணுகல் இல்லை"</string> + <string name="wifi_no_internet" msgid="8451173622563841546">"வைஃபை இணைய அணுகல் கொண்டிருக்கவில்லை"</string> <string name="wifi_no_internet_detailed" msgid="7593858887662270131">"விருப்பங்களுக்குத் தொடவும்"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"வைஃபை உடன் இணைக்க முடியவில்லை"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" இணைய இணைப்பு மோசமாக உள்ளது."</string> @@ -1084,7 +1084,7 @@ <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது"</string> <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது. சரிசெய்ய, தொடவும்."</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ஆதரிக்கப்படாத <xliff:g id="NAME">%s</xliff:g>"</string> - <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"சாதனம் <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைத்தில் அமைக்க, தொடவும்."</string> + <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"சாதனம் <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தொடவும்."</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string> <string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"தரவு இழப்பைத் தவிர்க்க, <xliff:g id="NAME">%s</xliff:g>ஐ அகற்றுவதற்கு முன் இணைப்பு நீக்கவும்"</string> <string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB பெரிபெரல் போர்ட்"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"கூடுதல் விருப்பங்கள்"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"மேல்தோன்றலை மூடு"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டது</item> + </plurals> </resources> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index dd36f3c..115c1cc 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> రోజులు"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"నమూనా ప్రారంభించబడింది"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"నమూనా క్లియర్ చేయబడింది"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"గడి జోడించబడింది"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>వ సెల్ను జోడించారు"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"నమూనా పూర్తయింది"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$dలో విడ్జెట్ %2$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"విడ్జెట్ను జోడించండి."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB పెరిఫెరల్ పోర్ట్"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"మరిన్ని ఎంపికలు"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"అతివ్యాప్తిని మూసివేస్తుంది"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఎంచుకోబడ్డాయి</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఎంచుకోబడింది</item> + </plurals> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 4528505..0b37f27 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> วัน"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"เริ่มวาดรูปแบบแล้ว"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ล้างรูปแบบแล้ว"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"เพิ่มเซลแล้ว"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"เพิ่มแล้ว <xliff:g id="CELL_INDEX">%1$s</xliff:g> เซลล์"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"วาดรูปแบบเสร็จสิ้น"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s วิดเจ็ต %2$d ของ %3$d"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"เพิ่มวิดเจ็ต"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"อุปกรณ์สำหรับต่อพอร์ต USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"ตัวเลือกเพิ่มเติม"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ปิดรายการเพิ่มเติม"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">เลือกไว้ <xliff:g id="COUNT_1">%1$d</xliff:g> รายการ</item> + <item quantity="one">เลือกไว้ <xliff:g id="COUNT_0">%1$d</xliff:g> รายการ</item> + </plurals> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 69a3b6a..6dd35d4 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (na) araw"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Sinimulan ang pattern"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Na-clear ang pattern"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Idinagdag ang cell"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Idinagdag ang cell <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Nakumpleto ang pattern"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d ng %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Magdagdag ng widget."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Peripheral Port"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Higit pang mga opsyon"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Isara ang overflow"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item> + </plurals> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 17ba456..7fd1fc2 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Desen başlatıldı"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Desen temizlendi"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Hücre eklendi"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g>. hücre eklendi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Desen tamamlandı"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget ekleyin."</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS isteği DIAL isteği olarak değiştirildi."</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS isteği USSD isteği olarak değiştirildi."</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS isteği yeni SS isteği olarak değiştirildi."</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"İş profili"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Çevre Birimi Bağlantı Noktası"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Çevre Birimi Bağlantı Noktası"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Diğer seçenekler"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Taşan araç çubuğunu kapat"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe seçildi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe seçildi</item> + </plurals> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 1702017..61e487c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string> <string name="terabyteShort" msgid="231613018159186962">"Тб"</string> <string name="petabyteShort" msgid="5637816680144990219">"Пб"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> год"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> год"</string> @@ -730,8 +731,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Малювання ключа розпочалося"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Ключ очищено"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Телефон додано"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Додано клітинку <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Малювання ключа закінчено"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Віджет %2$d з %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додати віджет."</string> @@ -1580,5 +1580,10 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Периферійний USB-порт"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Більше опцій"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Закрити розширені інструменти"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="few">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="many">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="other">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index cee75f6..38bdec8 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> دن"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹے"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹہ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"پیٹرن شروع ہو گیا"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"پیٹرن صاف کر دیا گیا"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"سیل شامل کر دیا گیا"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"سیل <xliff:g id="CELL_INDEX">%1$s</xliff:g> شامل ہو گيا"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"پیٹرن مکمل ہو گیا"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s۔ ویجیٹ %2$d از %3$d۔"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ویجیٹ شامل کریں"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS درخواست میں ترمیم کر کے DIAL درخواست بنا دی گئی ہے۔"</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS درخواست میں ترمیم کر کے USSD درخواست بنا دی گئی ہے۔"</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS درخواست میں ترمیم کر کے نئی SS درخواست بنا دی گئی ہے۔"</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"دفتری پروفائل"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB پیرفرل پورٹ"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB پیرفرل پورٹ"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"مزید اختیارات"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"اوورفلو بند کریں"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> منتخب کردہ</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> منتخب کردہ</item> + </plurals> </resources> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 3e2d1f1..e3eb789 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> kun"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> @@ -541,7 +542,7 @@ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Zaxiralangan ilovalar ma‘lumotlarini kodlashni talab qiladi."</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"Kameralarni o‘chirish"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Barcha qurilma kameralaridan foydalanishga yo‘l qo‘ymaydi."</string> - <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Ayrim ekran qulfi funk-ni o‘ch. qo‘yish"</string> + <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Funksiyalarni o‘chirib qo‘yish"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Ayrim ekranni qulflash funksiyalardan foydalanishning oldini olish."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Uy"</item> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Chizma namunasi ishga tushirildi"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Chizma namunasi tozalandi"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Katak qo‘shildi"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"<xliff:g id="CELL_INDEX">%1$s</xliff:g> qo‘shildi"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Chizma namunasi tugatildi"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidjet %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidjet qo‘shish."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Tashqi USB porti"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Ko‘proq"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Qalqib turuvchi asboblar panelini yopish"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta tanlandi</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta tanlandi</item> + </plurals> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index db87af3..1a2c8d3 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ngày"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Đã bắt đầu vẽ hình"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Đã xóa hình"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Đã thêm ô"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Đã thêm ô <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Đã vẽ xong hình"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Tiện ích %2$d trong số %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Thêm tiện ích."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Cổng ngoại vi USB"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Tùy chọn khác"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Đóng tràn"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">Đã chọn <xliff:g id="COUNT_1">%1$d</xliff:g></item> + <item quantity="one">Đã chọn <xliff:g id="COUNT_0">%1$d</xliff:g></item> + </plurals> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 3d30828..a7b4344 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> @@ -235,11 +236,9 @@ <string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string> <string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"短信"</string> - <!-- no translation found for permgroupdesc_sms (4656988620100940350) --> - <skip /> + <string name="permgroupdesc_sms" msgid="4656988620100940350">"发送和查看短信"</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"存储空间"</string> - <!-- no translation found for permgroupdesc_storage (637758554581589203) --> - <skip /> + <string name="permgroupdesc_storage" msgid="637758554581589203">"访问您设备上的照片、媒体内容和文件"</string> <string name="permgrouplab_dictionary" msgid="8114410334955871144">"用户字典"</string> <string name="permgroupdesc_dictionary" msgid="7586787746354378335">"读取用户字典中的字词或写入新字词。"</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"书签和历史记录"</string> @@ -251,8 +250,7 @@ <string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"传感器"</string> - <!-- no translation found for permgroupdesc_sensors (2280821510554029577) --> - <skip /> + <string name="permgroupdesc_sensors" msgid="2280821510554029577">"访问与您的生命体征和健身运动相关的信息"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检查您正与其进行互动的窗口的内容。"</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string> @@ -731,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"开始绘制图案"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"图案已清除"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已添加单元格"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已添加圆点 <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string> @@ -1543,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 请求已修改为 DIAL 请求。"</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 请求已修改为 USSD 请求。"</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 请求已修改为新的 SS 请求。"</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作资料"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 外设端口"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB 外设端口"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"更多选项"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"关闭工具栏溢出"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">已选择 <xliff:g id="COUNT_1">%1$d</xliff:g> 项</item> + <item quantity="one">已选择 <xliff:g id="COUNT_0">%1$d</xliff:g> 项</item> + </plurals> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index c1a8830..097acfa 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"已開始繪畫解鎖圖案"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"已清除解鎖圖案"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入一格"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已加入 <xliff:g id="CELL_INDEX">%1$s</xliff:g> 點"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖案"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string> @@ -1082,7 +1082,7 @@ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"已偵測到新<xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"用於轉移相片和媒體"</string> <string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> 已受損"</string> - <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> 受損,請輕觸以進行修正。"</string> + <string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> 受損,請輕觸以修正。"</string> <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"不支援的 <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unsupported_notification_message" msgid="8789610369456474891">"這部裝置目前不支援此 <xliff:g id="NAME">%s</xliff:g> 。請輕觸以設定為支援的格式。"</string> <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>被意外移除"</string> @@ -1107,11 +1107,11 @@ <string name="ext_media_status_checking" msgid="6193921557423194949">"正在檢查…"</string> <string name="ext_media_status_mounted" msgid="7253821726503179202">"準備就緒"</string> <string name="ext_media_status_mounted_ro" msgid="8020978752406021015">"唯讀"</string> - <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"非安全地移除"</string> + <string name="ext_media_status_bad_removal" msgid="8395398567890329422">"已在非安全狀態下移除"</string> <string name="ext_media_status_unmountable" msgid="805594039236667894">"已損毀"</string> <string name="ext_media_status_unsupported" msgid="4691436711745681828">"不支援"</string> - <string name="ext_media_status_ejecting" msgid="5463887263101234174">"正在卸載..."</string> - <string name="ext_media_status_formatting" msgid="1085079556538644861">"正在格式化..."</string> + <string name="ext_media_status_ejecting" msgid="5463887263101234174">"正在卸載…"</string> + <string name="ext_media_status_formatting" msgid="1085079556538644861">"正在格式化…"</string> <string name="ext_media_status_missing" msgid="5638633895221670766">"未插入"</string> <string name="activity_list_empty" msgid="1675388330786841066">"找不到相符的活動。"</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"轉送媒體輸出"</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB 外端連接埠"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"更多選項"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"關閉工具列溢位功能"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> + <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> + </plurals> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index acff73b..a64ff18 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"已開始繪製解鎖圖形"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"已清除解鎖圖形"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入 1 格"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已加入圓點 <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖形"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string> @@ -1540,12 +1540,14 @@ <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 要求已改為 DIAL 要求。"</string> <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已改為 USSD 要求。"</string> <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已改為新的 SS 要求。"</string> - <!-- no translation found for notification_work_profile_content_description (4600554564103770764) --> - <skip /> + <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work 設定檔"</string> <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 週邊連接埠"</string> <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB 週邊連接埠"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"更多選項"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"關閉溢出模式"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> + <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> + </plurals> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 08c7dab..5794daf 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -26,7 +26,8 @@ <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> - <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> + <!-- no translation found for fileSizeSuffix (8897567456150907538) --> + <skip /> <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> izinsuku"</string> <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> amahora"</string> <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> ihora"</string> @@ -728,8 +729,7 @@ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Kuqalwe iphethini"</string> <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Iphethini isusiwe"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Kwengezwe"</string> - <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) --> - <skip /> + <string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Iseli <xliff:g id="CELL_INDEX">%1$s</xliff:g> lingeziwe"</string> <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Iphethini isiphelile"</string> <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. iwijethi %2$d ye-%3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engeza iwijethi."</string> @@ -1546,5 +1546,8 @@ <string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Imbobo ye-USB Peripheral"</string> <string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"Izinketho eziningi"</string> <string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Vala ukuchichima"</string> - <!-- no translation found for selected_count (7187339492915744615) --> + <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item> + </plurals> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index c08d511..33c9c60 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4384,7 +4384,7 @@ i <enum name="simple" value="0" /> <!-- Line breaking uses high-quality strategy, including hyphenation. --> <enum name="high_quality" value="1" /> - <!-- Line breaking stratgegy balances line lengths. --> + <!-- Line breaking strategy balances line lengths. --> <enum name="balanced" value="2" /> </attr> <!-- Frequency of automatic hyphenation. --> @@ -4398,10 +4398,10 @@ i screens with limited space for text. --> <enum name="full" value="2" /> </attr> - <!-- Array of indents, one dimension value per line, left side. --> - <attr name="leftIndents" format="reference" /> - <!-- Array of indents, one dimension value per line, right side. --> - <attr name="rightIndents" format="reference" /> + <!-- Placeholder for a deleted attribute. This should be removed before M release. --> + <attr name="__removeBeforeMRelease_leftIndents" format="reference" /> + <!-- Placeholder for a deleted attribute. This should be removed before M release. --> + <attr name="__removeBeforeMRelease_rightIndents" format="reference" /> </declare-styleable> <declare-styleable name="TextViewAppearance"> <!-- Base text color, typeface, size, and style. --> @@ -7775,6 +7775,16 @@ i <!-- Text to set as the content description for the navigation button located at the start of the toolbar. --> <attr name="navigationContentDescription" format="string" /> + <!-- Drawable to set as the logo that appears at the starting side of + the Toolbar, just after the navigation button. --> + <attr name="logo" /> + <!-- A content description string to describe the appearance of the + associated logo image. --> + <attr name="logoDescription" format="string" /> + <!-- A color to apply to the title string. --> + <attr name="titleTextColor" format="color" /> + <!-- A color to apply to the subtitle string. --> + <attr name="subtitleTextColor" format="color" /> </declare-styleable> <declare-styleable name="Toolbar_LayoutParams"> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e7811df..7272ae3 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1271,11 +1271,6 @@ an mcc/mnc specific config.xml --> <string name="mobile_provisioning_url" translatable="false"></string> - <!-- This url is used as the default url when redirection is detected. Any - should work as all url's get redirected. But maybe overridden by - if needed. --> - <string name="mobile_redirected_provisioning_url" translatable="false">http://google.com</string> - <!-- The default character set for GsmAlphabet --> <!-- Empty string means MBCS is not considered --> <string name="gsm_alphabet_default_charset" translatable="false"></string> @@ -2196,6 +2191,9 @@ <!-- Keyguard component --> <string name="config_keyguardComponent" translatable="false">com.android.systemui/com.android.systemui.keyguard.KeyguardService</string> + <!-- For performance and storage reasons, limit the number of fingerprints per user --> + <integer name="config_fingerprintMaxTemplatesPerUser">5</integer> + <!-- This config is used to force VoiceInteractionService to start on certain low ram devices. It declares the package name of VoiceInteractionService that should be started. --> <string translatable="false" name="config_forceVoiceInteractionServicePackage"></string> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index bbe27a4..65fa36b 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2683,8 +2683,9 @@ <public type="attr" name="lockTaskMode" /> - <public type="attr" name="leftIndents" /> - <public type="attr" name="rightIndents" /> + <!-- Placeholder for a removed attribute. Remove this before M release. --> + <public type="attr" name="__removeBeforeMRelease_leftIndents" /> + <public type="attr" name="__removeBeforeMRelease_rightIndents" /> <public type="attr" name="showForAllUsers" /> @@ -2699,4 +2700,7 @@ <public type="attr" name="scrollIndicators" /> <public type="attr" name="hyphenationFrequency" /> <public type="attr" name="fingerprintAuthDrawable" /> + <public type="attr" name="logoDescription" /> + <public type="attr" name="titleTextColor" /> + <public type="attr" name="subtitleTextColor" /> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 2908cc5..ea0d349 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -34,7 +34,7 @@ to display a size in kilobytes, megabytes, or other size units. Some languages (like French) will want to add a space between the placeholders. --> - <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g><xliff:g id="unit" example="KB">%2$s</xliff:g></string> + <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="KB">%2$s</xliff:g></string> <!-- [CHAR_LIMIT=10] Suffix added to signify duration in days --> <string name="durationDays"><xliff:g id="days">%1$d</xliff:g> days</string> @@ -537,10 +537,10 @@ <!-- Label for the Android system components when they are shown to the user. --> <string name="android_system_label">Android System</string> - <!-- Label for the user owner in the intent forwarding app. --> - <string name="user_owner_label">Personal apps</string> + <!-- Label for the user owner in the intent forwarding app. [CHAR LIMIT=15] --> + <string name="user_owner_label">Personal</string> - <!-- Label for a corporate profile in the intent forwarding app. --> + <!-- Label for a corporate profile in the intent forwarding app. [CHAR LIMIT=15] --> <string name="managed_profile_label">Work</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> @@ -1969,9 +1969,9 @@ <string name="lockscreen_access_pattern_start">Pattern started</string> <!-- Accessibility description sent when the pattern times out and is cleared. [CHAR LIMIT=NONE] --> <string name="lockscreen_access_pattern_cleared">Pattern cleared</string> - <!-- Accessibility description sent when user adds a cell to the pattern. [CHAR LIMIT=NONE] --> + <!-- Accessibility description sent when user adds a dot to the pattern. [CHAR LIMIT=NONE] --> <string name="lockscreen_access_pattern_cell_added">Cell added</string> - <!-- Accessibility description sent when user adds a cell to the pattern. Announces the + <!-- Accessibility description sent when user adds a dot to the pattern. Announces the actual cell when headphones are connected [CHAR LIMIT=NONE] --> <string name="lockscreen_access_pattern_cell_added_verbose"> Cell <xliff:g id="cell_index" example="3">%1$s</xliff:g> added</string> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 70f9c02..1b9c409 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -574,16 +574,16 @@ please see styles_device_defaults.xml. <style name="Widget.Material.CompoundButton" parent="Widget.CompoundButton"/> <style name="Widget.Material.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox"> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> </style> <style name="Widget.Material.CompoundButton.RadioButton" parent="Widget.CompoundButton.RadioButton"> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> </style> <style name="Widget.Material.CompoundButton.Star" parent="Widget.CompoundButton.Star"> <item name="button">@drawable/btn_star_material</item> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> </style> <style name="Widget.Material.CompoundButton.Switch"> @@ -592,7 +592,7 @@ please see styles_device_defaults.xml. <item name="switchTextAppearance">@style/TextAppearance.Material.Widget.Switch</item> <item name="textOn">@string/capital_on</item> <item name="textOff">@string/capital_off</item> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> <item name="showText">false</item> </style> @@ -730,7 +730,7 @@ please see styles_device_defaults.xml. <item name="paddingStart">16dip</item> <item name="paddingEnd">16dip</item> <item name="mirrorForRtl">true</item> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_32dp_material</item> </style> <style name="Widget.Material.RatingBar" parent="Widget.RatingBar"> @@ -812,7 +812,7 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Material.Toolbar.Button.Navigation" parent="Widget.Material"> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> <item name="minWidth">56dp</item> <item name="scaleType">center</item> <item name="paddingStart">@dimen/action_bar_navigation_padding_start_material</item> @@ -869,7 +869,7 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Material.ActionButton.CloseMode"> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> <!-- Should match Widget.Material.Toolbar.Button.Navigation minWidth. --> <item name="minWidth">56dp</item> </style> @@ -967,7 +967,7 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Material.MediaRouteButton"> - <item name="background">@drawable/control_background_material</item> + <item name="background">@drawable/control_background_40dp_material</item> <item name="externalRouteEnabledDrawable">@drawable/ic_media_route_material</item> <item name="minWidth">56dp</item> <item name="minHeight">48dp</item> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 45e5d17..5ba57c4 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -818,7 +818,6 @@ <java-symbol type="string" name="progress_unmounting" /> <java-symbol type="string" name="mobile_provisioning_apn" /> <java-symbol type="string" name="mobile_provisioning_url" /> - <java-symbol type="string" name="mobile_redirected_provisioning_url" /> <java-symbol type="string" name="quick_contacts_not_available" /> <java-symbol type="string" name="reboot_to_update_package" /> <java-symbol type="string" name="reboot_to_update_prepare" /> @@ -2125,6 +2124,9 @@ <java-symbol type="string" name="fingerprint_error_lockout" /> <java-symbol type="string" name="fingerprint_name_template" /> + <!-- Fingerprint config --> + <java-symbol type="integer" name="config_fingerprintMaxTemplatesPerUser"/> + <!-- From various Material changes --> <java-symbol type="attr" name="titleTextAppearance" /> <java-symbol type="attr" name="subtitleTextAppearance" /> @@ -2309,5 +2311,6 @@ <java-symbol type="string" name="ext_media_unsupported_notification_message" /> <java-symbol type="string" name="ext_media_unsupported_notification_title" /> <java-symbol type="plurals" name="selected_count" /> + <java-symbol type="drawable" name="ic_dialog_alert_material" /> </resources> diff --git a/core/tests/coretests/src/android/net/NetworkTest.java b/core/tests/coretests/src/android/net/NetworkTest.java index b0ecb04..74b6d98 100644 --- a/core/tests/coretests/src/android/net/NetworkTest.java +++ b/core/tests/coretests/src/android/net/NetworkTest.java @@ -16,11 +16,14 @@ package android.net; +import static android.test.MoreAsserts.assertNotEqual; + import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.net.Network; import android.test.suitebuilder.annotation.SmallTest; + import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -29,6 +32,7 @@ import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Inet6Address; import java.net.SocketException; + import junit.framework.TestCase; public class NetworkTest extends TestCase { @@ -93,4 +97,50 @@ public class NetworkTest extends TestCase { fail("SocketException not thrown"); } catch (SocketException expected) {} } + + @SmallTest + public void testZeroIsObviousForDebugging() { + Network zero = new Network(0); + assertEquals(0, zero.hashCode()); + assertEquals(0, zero.getNetworkHandle()); + assertEquals("0", zero.toString()); + } + + @SmallTest + public void testGetNetworkHandle() { + Network one = new Network(1); + Network two = new Network(2); + Network three = new Network(3); + + // None of the hashcodes are zero. + assertNotEqual(0, one.hashCode()); + assertNotEqual(0, two.hashCode()); + assertNotEqual(0, three.hashCode()); + + // All the hashcodes are distinct. + assertNotEqual(one.hashCode(), two.hashCode()); + assertNotEqual(one.hashCode(), three.hashCode()); + assertNotEqual(two.hashCode(), three.hashCode()); + + // None of the handles are zero. + assertNotEqual(0, one.getNetworkHandle()); + assertNotEqual(0, two.getNetworkHandle()); + assertNotEqual(0, three.getNetworkHandle()); + + // All the handles are distinct. + assertNotEqual(one.getNetworkHandle(), two.getNetworkHandle()); + assertNotEqual(one.getNetworkHandle(), three.getNetworkHandle()); + assertNotEqual(two.getNetworkHandle(), three.getNetworkHandle()); + + // The handles are not equal to the hashcodes. + assertNotEqual(one.hashCode(), one.getNetworkHandle()); + assertNotEqual(two.hashCode(), two.getNetworkHandle()); + assertNotEqual(three.hashCode(), three.getNetworkHandle()); + + // Adjust as necessary to test an implementation's specific constants. + // When running with runtest, "adb logcat -s TestRunner" can be useful. + assertEquals(4311403230L, one.getNetworkHandle()); + assertEquals(8606370526L, two.getNetworkHandle()); + assertEquals(12901337822L, three.getNetworkHandle()); + } } |
