diff options
Diffstat (limited to 'core')
289 files changed, 5191 insertions, 1512 deletions
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java index be00aa5..51c6f3a 100644 --- a/core/java/android/app/ActionBar.java +++ b/core/java/android/app/ActionBar.java @@ -29,16 +29,29 @@ import android.view.Window; import android.widget.SpinnerAdapter; /** - * Acts as a replacement for the title bar in Activities. - * The action bar provides facilities for creating toolbar actions as well as - * methods of navigating the application. - * <p>By default, the action bar appears at the top of every activity, with the application icon on - * the left, followed by the activity title. Items from the activity's options menu are also - * accessible from the action bar.</p> + * A window feature at the top of the activity that may display the activity title, navigation + * modes, and other interactive items. + * <p>Beginning with Android 3.0 (API level 11), the action bar appears at the top of an + * activity's window when the activity uses the system's {@link + * android.R.style#Theme_Holo Holo} theme (or one of its descendant themes), which is the default. + * You may otherwise add the action bar by calling {@link + * android.view.Window#requestFeature requestFeature(FEATURE_ACTION_BAR)} or by declaring it in a + * custom theme with the {@link android.R.styleable#Theme_windowActionBar windowActionBar} property. + * <p>By default, the action bar shows the application icon on + * the left, followed by the activity title. If your activity has an options menu, you can make + * select items accessible directly from the action bar as "action items". You can also + * modify various characteristics of the action bar or remove it completely.</p> * <p>From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link * android.app.Activity#getActionBar getActionBar()}.</p> - * <p>For more information, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action + * <p>For information about how to use the action bar, including how to add action items, navigation + * modes and more, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action * Bar</a> developer guide.</p> + * <p>In some cases, the action bar may be overlayed by another bar that enables contextual actions, + * using an {@link android.view.ActionMode}. For example, when the user selects one or more items in + * your activity, you can enable an action mode that offers actions specific to the selected + * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the + * same space, the {@link android.view.ActionMode} APIs are distinct and independent from those for + * {@link ActionBar}. */ public abstract class ActionBar { /** @@ -423,6 +436,7 @@ public abstract class ActionBar { * Set the ActionBar's split background. This will appear in * the split action bar containing menu-provided action buttons * on some devices and configurations. + * <p>You can enable split action bar with {@link android.R.attr#uiOptions} * * @param d Background drawable for the split bar */ @@ -460,13 +474,6 @@ public abstract class ActionBar { * </ul> * * @return The current navigation mode. - * - * @see #setStandardNavigationMode() - * @see #setStandardNavigationMode(CharSequence) - * @see #setStandardNavigationMode(CharSequence, CharSequence) - * @see #setDropdownNavigationMode(SpinnerAdapter) - * @see #setTabNavigationMode() - * @see #setCustomNavigationMode(View) */ public abstract int getNavigationMode(); @@ -498,7 +505,6 @@ public abstract class ActionBar { * @return A new Tab * * @see #addTab(Tab) - * @see #insertTab(Tab, int) */ public abstract Tab newTab(); @@ -606,7 +612,7 @@ public abstract class ActionBar { public abstract void show(); /** - * Hide the ActionBar if it is not currently showing. + * Hide the ActionBar if it is currently showing. * If the window hosting the ActionBar does not have the feature * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application * content to fit the new space available. diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 7799779..b4471f0 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1550,6 +1550,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + dismissKeyguardOnNextActivity(); + reply.writeNoException(); + return true; + } + } return super.onTransact(code, data, reply, flags); @@ -3504,5 +3511,15 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + public void dismissKeyguardOnNextActivity() throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + mRemote.transact(DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + private IBinder mRemote; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2c2a493..0776e10 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -153,6 +153,7 @@ public final class ActivityThread { final HashMap<IBinder, Service> mServices = new HashMap<IBinder, Service>(); AppBindData mBoundApplication; + Profiler mProfiler; Configuration mConfiguration; Configuration mCompatConfiguration; Configuration mResConfiguration; @@ -364,10 +365,6 @@ public final class ActivityThread { ApplicationInfo appInfo; List<ProviderInfo> providers; ComponentName instrumentationName; - String profileFile; - ParcelFileDescriptor profileFd; - boolean autoStopProfiler; - boolean profiling; Bundle instrumentationArgs; IInstrumentationWatcher instrumentationWatcher; int debugMode; @@ -375,10 +372,23 @@ public final class ActivityThread { boolean persistent; Configuration config; CompatibilityInfo compatInfo; - boolean handlingProfiling; + + /** Initial values for {@link Profiler}. */ + String initProfileFile; + ParcelFileDescriptor initProfileFd; + boolean initAutoStopProfiler; + public String toString() { return "AppBindData{appInfo=" + appInfo + "}"; } + } + + static final class Profiler { + String profileFile; + ParcelFileDescriptor profileFd; + boolean autoStopProfiler; + boolean profiling; + boolean handlingProfiling; public void setProfiler(String file, ParcelFileDescriptor fd) { if (profiling) { if (fd != null) { @@ -661,8 +671,6 @@ public final class ActivityThread { data.appInfo = appInfo; data.providers = providers; data.instrumentationName = instrumentationName; - data.setProfiler(profileFile, profileFd); - data.autoStopProfiler = false; data.instrumentationArgs = instrumentationArgs; data.instrumentationWatcher = instrumentationWatcher; data.debugMode = debugMode; @@ -670,6 +678,9 @@ public final class ActivityThread { data.persistent = persistent; data.config = config; data.compatInfo = compatInfo; + data.initProfileFile = profileFile; + data.initProfileFd = profileFd; + data.initAutoStopProfiler = false; queueOrSendMessage(H.BIND_APPLICATION, data); } @@ -1293,8 +1304,8 @@ public final class ActivityThread { public final boolean queueIdle() { ActivityClientRecord a = mNewActivities; boolean stopProfiling = false; - if (mBoundApplication != null && mBoundApplication.profileFd != null - && mBoundApplication.autoStopProfiler) { + if (mBoundApplication != null && mProfiler.profileFd != null + && mProfiler.autoStopProfiler) { stopProfiling = true; } if (a != null) { @@ -1320,7 +1331,7 @@ public final class ActivityThread { } while (a != null); } if (stopProfiling) { - mBoundApplication.stopProfiling(); + mProfiler.stopProfiling(); } ensureJitEnabled(); return false; @@ -1635,12 +1646,12 @@ public final class ActivityThread { } public boolean isProfiling() { - return mBoundApplication != null && mBoundApplication.profileFile != null - && mBoundApplication.profileFd == null; + return mProfiler != null && mProfiler.profileFile != null + && mProfiler.profileFd == null; } public String getProfileFilePath() { - return mBoundApplication.profileFile; + return mProfiler.profileFile; } public Looper getLooper() { @@ -1679,6 +1690,9 @@ public final class ActivityThread { ContextImpl context = getSystemContext(); context.init(new LoadedApk(this, "android", context, info, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO), null, this); + + // give ourselves a default profiler + mProfiler = new Profiler(); } } @@ -1947,9 +1961,9 @@ public final class ActivityThread { unscheduleGcIdler(); if (r.profileFd != null) { - mBoundApplication.setProfiler(r.profileFile, r.profileFd); - mBoundApplication.startProfiling(); - mBoundApplication.autoStopProfiler = r.autoStopProfiler; + mProfiler.setProfiler(r.profileFile, r.profileFd); + mProfiler.startProfiling(); + mProfiler.autoStopProfiler = r.autoStopProfiler; } if (localLOGV) Slog.v( @@ -3570,10 +3584,10 @@ public final class ActivityThread { case 1: ViewDebug.startLooperProfiling(pcd.path, pcd.fd.getFileDescriptor()); break; - default: - mBoundApplication.setProfiler(pcd.path, pcd.fd); - mBoundApplication.autoStopProfiler = false; - mBoundApplication.startProfiling(); + default: + mProfiler.setProfiler(pcd.path, pcd.fd); + mProfiler.autoStopProfiler = false; + mProfiler.startProfiling(); break; } } catch (RuntimeException e) { @@ -3592,7 +3606,7 @@ public final class ActivityThread { ViewDebug.stopLooperProfiling(); break; default: - mBoundApplication.stopProfiling(); + mProfiler.stopProfiling(); break; } } @@ -3685,6 +3699,11 @@ public final class ActivityThread { mConfiguration = new Configuration(data.config); mCompatConfiguration = new Configuration(data.config); + mProfiler = new Profiler(); + mProfiler.profileFile = data.initProfileFile; + mProfiler.profileFd = data.initProfileFd; + mProfiler.autoStopProfiler = data.initAutoStopProfiler; + // send up app name; do this *before* waiting for debugger Process.setArgV0(data.processName); android.ddm.DdmHandleAppName.setAppName(data.processName); @@ -3699,8 +3718,8 @@ public final class ActivityThread { } } - if (data.profileFd != null) { - data.startProfiling(); + if (mProfiler.profileFd != null) { + mProfiler.startProfiling(); } // If the app is Honeycomb MR1 or earlier, switch its AsyncTask @@ -3841,10 +3860,10 @@ public final class ActivityThread { mInstrumentation.init(this, instrContext, appContext, new ComponentName(ii.packageName, ii.name), data.instrumentationWatcher); - if (data.profileFile != null && !ii.handleProfiling - && data.profileFd == null) { - data.handlingProfiling = true; - File file = new File(data.profileFile); + if (mProfiler.profileFile != null && !ii.handleProfiling + && mProfiler.profileFd == null) { + mProfiler.handlingProfiling = true; + File file = new File(mProfiler.profileFile); file.getParentFile().mkdirs(); Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024); } @@ -3896,8 +3915,8 @@ public final class ActivityThread { /*package*/ final void finishInstrumentation(int resultCode, Bundle results) { IActivityManager am = ActivityManagerNative.getDefault(); - if (mBoundApplication.profileFile != null && mBoundApplication.handlingProfiling - && mBoundApplication.profileFd == null) { + if (mProfiler.profileFile != null && mProfiler.handlingProfiling + && mProfiler.profileFd == null) { Debug.stopMethodTracing(); } //Slog.i(TAG, "am: " + ActivityManagerNative.getDefault() diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 27dd691..26813bf 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -372,6 +372,8 @@ public interface IActivityManager extends IInterface { public void showBootMessage(CharSequence msg, boolean always) throws RemoteException; + public void dismissKeyguardOnNextActivity() throws RemoteException; + /* * Private non-Binder interfaces */ @@ -602,4 +604,5 @@ public interface IActivityManager extends IInterface { int UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+135; int GET_PROCESS_PSS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+136; int SHOW_BOOT_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+137; + int DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+138; } diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index 5c4cc87..3290b9d 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -338,7 +338,7 @@ public class SearchManager /** * Column name for suggestions cursor. <i>Optional.</i> This column may be - * used to specify the time in (@link System#currentTimeMillis + * used to specify the time in {@link System#currentTimeMillis * System.currentTImeMillis()} (wall time in UTC) when an item was last * accessed within the results-providing application. If set, this may be * used to show more-recently-used items first. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 72cf26a..f44d038 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -5577,24 +5577,35 @@ public class Intent implements Parcelable, Cloneable { @Override public String toString() { - StringBuilder b = new StringBuilder(128); + StringBuilder b = new StringBuilder(128); b.append("Intent { "); - toShortString(b, true, true); + toShortString(b, true, true, true); b.append(" }"); return b.toString(); } /** @hide */ - public String toShortString(boolean comp, boolean extras) { - StringBuilder b = new StringBuilder(128); - toShortString(b, comp, extras); + public String toInsecureString() { + StringBuilder b = new StringBuilder(128); + + b.append("Intent { "); + toShortString(b, false, true, true); + b.append(" }"); + return b.toString(); } /** @hide */ - public void toShortString(StringBuilder b, boolean comp, boolean extras) { + public String toShortString(boolean secure, boolean comp, boolean extras) { + StringBuilder b = new StringBuilder(128); + toShortString(b, secure, comp, extras); + return b.toString(); + } + + /** @hide */ + public void toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras) { boolean first = true; if (mAction != null) { b.append("act=").append(mAction); @@ -5621,19 +5632,8 @@ public class Intent implements Parcelable, Cloneable { } first = false; b.append("dat="); - String scheme = mData.getScheme(); - if (scheme != null) { - if (scheme.equalsIgnoreCase("tel")) { - b.append("tel:xxx-xxx-xxxx"); - } else if (scheme.equalsIgnoreCase("sip")) { - b.append("sip:xxxxxxxxxx"); - } else if (scheme.equalsIgnoreCase("sms")) { - b.append("sms:xxx-xxx-xxxx"); - } else if (scheme.equalsIgnoreCase("smsto")) { - b.append("smsto:xxx-xxx-xxxx"); - } else { - b.append(mData); - } + if (secure) { + b.append(mData.toSafeString()); } else { b.append(mData); } diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index bba329d..0e6694d 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -442,7 +442,11 @@ public class ActivityInfo extends ComponentInfo public int uiOptions = 0; /** - * Flag for use with uiOptions. + * Flag for use with {@link #uiOptions}. + * Indicates that the action bar should put all action items in a separate bar when + * the screen is narrow. + * <p>This value corresponds to "splitActionBarWhenNarrow" for the {@link #uiOptions} XML + * attribute. */ public static final int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = 1; diff --git a/core/java/android/content/pm/PackageInfoLite.java b/core/java/android/content/pm/PackageInfoLite.java index da97fde..9625944 100644 --- a/core/java/android/content/pm/PackageInfoLite.java +++ b/core/java/android/content/pm/PackageInfoLite.java @@ -41,6 +41,8 @@ public class PackageInfoLite implements Parcelable { public int recommendedInstallLocation; public int installLocation; + public VerifierInfo[] verifiers; + public PackageInfoLite() { } @@ -58,6 +60,13 @@ public class PackageInfoLite implements Parcelable { dest.writeString(packageName); dest.writeInt(recommendedInstallLocation); dest.writeInt(installLocation); + + if (verifiers == null || verifiers.length == 0) { + dest.writeInt(0); + } else { + dest.writeInt(verifiers.length); + dest.writeTypedArray(verifiers, parcelableFlags); + } } public static final Parcelable.Creator<PackageInfoLite> CREATOR @@ -75,5 +84,13 @@ public class PackageInfoLite implements Parcelable { packageName = source.readString(); recommendedInstallLocation = source.readInt(); installLocation = source.readInt(); + + final int verifiersLength = source.readInt(); + if (verifiersLength == 0) { + verifiers = new VerifierInfo[0]; + } else { + verifiers = new VerifierInfo[verifiersLength]; + source.readTypedArray(verifiers, VerifierInfo.CREATOR); + } } } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index ef7e233..d45a71a 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -725,6 +725,16 @@ public abstract class PackageManager { public static final int MOVE_EXTERNAL_MEDIA = 0x00000002; /** + * Usable by the required verifier as the {@code verificationCode} argument + * for {@link PackageManager#verifyPendingInstall} to indicate that it will + * allow the installation to proceed without any of the optional verifiers + * needing to vote. + * + * @hide + */ + public static final int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT = 2; + + /** * Used as the {@code verificationCode} argument for * {@link PackageManager#verifyPendingInstall} to indicate that the calling * package verifier allows the installation to proceed. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index e7b844c..c30675b 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -28,7 +28,9 @@ import android.os.Build; import android.os.Bundle; import android.os.PatternMatcher; import android.util.AttributeSet; +import android.util.Base64; import android.util.DisplayMetrics; +import android.util.Log; import android.util.Slog; import android.util.TypedValue; import com.android.internal.util.XmlUtils; @@ -40,11 +42,18 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; +import java.security.spec.EncodedKeySpec; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; +import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -150,12 +159,14 @@ public class PackageParser { * @hide */ public static class PackageLite { - public String packageName; - public int installLocation; - public String mScanPath; - public PackageLite(String packageName, int installLocation) { + public final String packageName; + public final int installLocation; + public final VerifierInfo[] verifiers; + + public PackageLite(String packageName, int installLocation, List<VerifierInfo> verifiers) { this.packageName = packageName; this.installLocation = installLocation; + this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]); } } @@ -619,8 +630,9 @@ public class PackageParser { * @return PackageLite object with package information or null on failure. */ public static PackageLite parsePackageLite(String packageFilePath, int flags) { - XmlResourceParser parser = null; AssetManager assmgr = null; + final XmlResourceParser parser; + final Resources res; try { assmgr = new AssetManager(); assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -631,6 +643,9 @@ public class PackageParser { return null; } + final DisplayMetrics metrics = new DisplayMetrics(); + metrics.setToDefaults(); + res = new Resources(assmgr, metrics, null); parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME); } catch (Exception e) { if (assmgr != null) assmgr.close(); @@ -638,11 +653,12 @@ public class PackageParser { + packageFilePath, e); return null; } - AttributeSet attrs = parser; - String errors[] = new String[1]; + + final AttributeSet attrs = parser; + final String errors[] = new String[1]; PackageLite packageLite = null; try { - packageLite = parsePackageLite(parser, attrs, flags, errors); + packageLite = parsePackageLite(res, parser, attrs, flags, errors); } catch (IOException e) { Slog.w(TAG, packageFilePath, e); } catch (XmlPullParserException e) { @@ -719,9 +735,9 @@ public class PackageParser { return pkgName.intern(); } - private static PackageLite parsePackageLite(XmlPullParser parser, - AttributeSet attrs, int flags, String[] outError) - throws IOException, XmlPullParserException { + private static PackageLite parsePackageLite(Resources res, XmlPullParser parser, + AttributeSet attrs, int flags, String[] outError) throws IOException, + XmlPullParserException { int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -759,7 +775,26 @@ public class PackageParser { break; } } - return new PackageLite(pkgName.intern(), installLocation); + + // Only search the tree when the tag is directly below <manifest> + final int searchDepth = parser.getDepth() + 1; + + final List<VerifierInfo> verifiers = new ArrayList<VerifierInfo>(); + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() >= searchDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + + if (parser.getDepth() == searchDepth && "package-verifier".equals(parser.getName())) { + final VerifierInfo verifier = parseVerifier(res, parser, attrs, flags, outError); + if (verifier != null) { + verifiers.add(verifier); + } + } + } + + return new PackageLite(pkgName.intern(), installLocation, verifiers); } /** @@ -2691,6 +2726,63 @@ public class PackageParser { return data; } + private static VerifierInfo parseVerifier(Resources res, XmlPullParser parser, + AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException, + IOException { + final TypedArray sa = res.obtainAttributes(attrs, + com.android.internal.R.styleable.AndroidManifestPackageVerifier); + + final String packageName = sa.getNonResourceString( + com.android.internal.R.styleable.AndroidManifestPackageVerifier_name); + + final String encodedPublicKey = sa.getNonResourceString( + com.android.internal.R.styleable.AndroidManifestPackageVerifier_publicKey); + + sa.recycle(); + + if (packageName == null || packageName.length() == 0) { + Slog.i(TAG, "verifier package name was null; skipping"); + return null; + } else if (encodedPublicKey == null) { + Slog.i(TAG, "verifier " + packageName + " public key was null; skipping"); + } + + EncodedKeySpec keySpec; + try { + final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT); + keySpec = new X509EncodedKeySpec(encoded); + } catch (IllegalArgumentException e) { + Slog.i(TAG, "Could not parse verifier " + packageName + " public key; invalid Base64"); + return null; + } + + /* First try the key as an RSA key. */ + try { + final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + final PublicKey publicKey = keyFactory.generatePublic(keySpec); + return new VerifierInfo(packageName, publicKey); + } catch (NoSuchAlgorithmException e) { + Log.wtf(TAG, "Could not parse public key because RSA isn't included in build"); + return null; + } catch (InvalidKeySpecException e) { + // Not a RSA public key. + } + + /* Now try it as a DSA key. */ + try { + final KeyFactory keyFactory = KeyFactory.getInstance("DSA"); + final PublicKey publicKey = keyFactory.generatePublic(keySpec); + return new VerifierInfo(packageName, publicKey); + } catch (NoSuchAlgorithmException e) { + Log.wtf(TAG, "Could not parse public key because DSA isn't included in build"); + return null; + } catch (InvalidKeySpecException e) { + // Not a DSA public key. + } + + return null; + } + private static final String ANDROID_RESOURCES = "http://schemas.android.com/apk/res/android"; diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java index c6aefb8..9c9340d 100644 --- a/core/java/android/content/pm/Signature.java +++ b/core/java/android/content/pm/Signature.java @@ -19,7 +19,12 @@ package android.content.pm; import android.os.Parcel; import android.os.Parcelable; +import java.io.ByteArrayInputStream; import java.lang.ref.SoftReference; +import java.security.PublicKey; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; import java.util.Arrays; /** @@ -135,6 +140,20 @@ public class Signature implements Parcelable { return bytes; } + /** + * Returns the public key for this signature. + * + * @throws CertificateException when Signature isn't a valid X.509 + * certificate; shouldn't happen. + * @hide + */ + public PublicKey getPublicKey() throws CertificateException { + final CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + final ByteArrayInputStream bais = new ByteArrayInputStream(mSignature); + final Certificate cert = certFactory.generateCertificate(bais); + return cert.getPublicKey(); + } + @Override public boolean equals(Object obj) { try { diff --git a/core/java/android/content/pm/VerifierInfo.aidl b/core/java/android/content/pm/VerifierInfo.aidl new file mode 100644 index 0000000..7702d38 --- /dev/null +++ b/core/java/android/content/pm/VerifierInfo.aidl @@ -0,0 +1,19 @@ +/* + * Copyright 2011, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +parcelable VerifierInfo; diff --git a/core/java/android/content/pm/VerifierInfo.java b/core/java/android/content/pm/VerifierInfo.java new file mode 100644 index 0000000..0a2b283 --- /dev/null +++ b/core/java/android/content/pm/VerifierInfo.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.security.PublicKey; + +/** + * Contains information about a package verifier as used by + * {@code PackageManagerService} during package verification. + * + * @hide + */ +public class VerifierInfo implements Parcelable { + /** Package name of the verifier. */ + public final String packageName; + + /** Signatures used to sign the package verifier's package. */ + public final PublicKey publicKey; + + /** + * Creates an object that represents a verifier info object. + * + * @param packageName the package name in Java-style. Must not be {@code + * null} or empty. + * @param publicKey the public key for the signer encoded in Base64. Must + * not be {@code null} or empty. + * @throws IllegalArgumentException if either argument is null or empty. + */ + public VerifierInfo(String packageName, PublicKey publicKey) { + if (packageName == null || packageName.length() == 0) { + throw new IllegalArgumentException("packageName must not be null or empty"); + } else if (publicKey == null) { + throw new IllegalArgumentException("publicKey must not be null"); + } + + this.packageName = packageName; + this.publicKey = publicKey; + } + + private VerifierInfo(Parcel source) { + packageName = source.readString(); + publicKey = (PublicKey) source.readSerializable(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(packageName); + dest.writeSerializable(publicKey); + } + + public static final Parcelable.Creator<VerifierInfo> CREATOR + = new Parcelable.Creator<VerifierInfo>() { + public VerifierInfo createFromParcel(Parcel source) { + return new VerifierInfo(source); + } + + public VerifierInfo[] newArray(int size) { + return new VerifierInfo[size]; + } + }; +}
\ No newline at end of file diff --git a/core/java/android/inputmethodservice/Keyboard.java b/core/java/android/inputmethodservice/Keyboard.java index 10386f8..4fe54c0 100644 --- a/core/java/android/inputmethodservice/Keyboard.java +++ b/core/java/android/inputmethodservice/Keyboard.java @@ -144,6 +144,8 @@ public class Keyboard { /** Number of key widths from current touch point to search for nearest keys. */ private static float SEARCH_DISTANCE = 1.8f; + private ArrayList<Row> rows = new ArrayList<Row>(); + /** * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate. * Some of the key size defaults can be overridden per row from what the {@link Keyboard} @@ -164,6 +166,9 @@ public class Keyboard { public int defaultHorizontalGap; /** Vertical gap following this row. */ public int verticalGap; + + ArrayList<Key> mKeys = new ArrayList<Key>(); + /** * Edge flags for this row of keys. Possible values that can be assigned are * {@link Keyboard#EDGE_TOP EDGE_TOP} and {@link Keyboard#EDGE_BOTTOM EDGE_BOTTOM} @@ -256,7 +261,7 @@ public class Keyboard { public CharSequence text; /** Popup characters */ public CharSequence popupCharacters; - + /** * Flags that specify the anchoring to edges of the keyboard for detecting touch events * that are just out of the boundary of the key. This is a bit mask of @@ -596,11 +601,44 @@ public class Keyboard { column++; x += key.width + key.gap; mKeys.add(key); + row.mKeys.add(key); if (x > mTotalWidth) { mTotalWidth = x; } } - mTotalHeight = y + mDefaultHeight; + mTotalHeight = y + mDefaultHeight; + rows.add(row); + } + + final void resize(int newWidth, int newHeight) { + int numRows = rows.size(); + for (int rowIndex = 0; rowIndex < numRows; ++rowIndex) { + Row row = rows.get(rowIndex); + int numKeys = row.mKeys.size(); + int totalGap = 0; + int totalWidth = 0; + for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) { + Key key = row.mKeys.get(keyIndex); + if (keyIndex > 0) { + totalGap += key.gap; + } + totalWidth += key.width; + } + if (totalGap + totalWidth > newWidth) { + int x = 0; + float scaleFactor = (float)(newWidth - totalGap) / totalWidth; + for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) { + Key key = row.mKeys.get(keyIndex); + key.width *= scaleFactor; + key.x = x; + x += key.width + key.gap; + } + } + } + mTotalWidth = newWidth; + // TODO: This does not adjust the vertical placement according to the new size. + // The main problem in the previous code was horizontal placement/size, but we should + // also recalculate the vertical sizes/positions when we get this resize call. } public List<Key> getKeys() { @@ -749,7 +787,7 @@ public class Keyboard { Row currentRow = null; Resources res = context.getResources(); boolean skipRow = false; - + try { int event; while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { @@ -759,6 +797,7 @@ public class Keyboard { inRow = true; x = 0; currentRow = createRowFromXml(res, parser); + rows.add(currentRow); skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode; if (skipRow) { skipToEndOfRow(parser); @@ -781,6 +820,7 @@ public class Keyboard { } else if (key.codes[0] == KEYCODE_ALT) { mModifierKeys.add(key); } + currentRow.mKeys.add(key); } else if (TAG_KEYBOARD.equals(tag)) { parseKeyboardAttributes(res, parser); } diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java index 05444f6..1119c1e 100644 --- a/core/java/android/inputmethodservice/KeyboardView.java +++ b/core/java/android/inputmethodservice/KeyboardView.java @@ -376,6 +376,7 @@ public class KeyboardView extends View implements View.OnClickListener { initGestureDetector(); } + private void initGestureDetector() { mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { @Override @@ -615,6 +616,9 @@ public class KeyboardView extends View implements View.OnClickListener { @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); + if (mKeyboard != null) { + mKeyboard.resize(w, h); + } // Release the buffer, if any and it will be reallocated on the next draw mBuffer = null; } diff --git a/core/java/android/net/DhcpInfoInternal.java b/core/java/android/net/DhcpInfoInternal.java index 9b0a2d7..fa77bc5 100644 --- a/core/java/android/net/DhcpInfoInternal.java +++ b/core/java/android/net/DhcpInfoInternal.java @@ -24,6 +24,7 @@ import java.net.Inet4Address; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; /** * A simple object for retrieving the results of a DHCP request. @@ -41,14 +42,18 @@ public class DhcpInfoInternal { public String serverAddress; public int leaseDuration; - private Collection<RouteInfo> routes; + private Collection<RouteInfo> mRoutes; public DhcpInfoInternal() { - routes = new ArrayList<RouteInfo>(); + mRoutes = new ArrayList<RouteInfo>(); } public void addRoute(RouteInfo routeInfo) { - routes.add(routeInfo); + mRoutes.add(routeInfo); + } + + public Collection<RouteInfo> getRoutes() { + return Collections.unmodifiableCollection(mRoutes); } private int convertToInt(String addr) { @@ -66,7 +71,7 @@ public class DhcpInfoInternal { public DhcpInfo makeDhcpInfo() { DhcpInfo info = new DhcpInfo(); info.ipAddress = convertToInt(ipAddress); - for (RouteInfo route : routes) { + for (RouteInfo route : mRoutes) { if (route.isDefaultRoute()) { info.gateway = convertToInt(route.getGateway().getHostAddress()); break; @@ -94,14 +99,14 @@ public class DhcpInfoInternal { public LinkProperties makeLinkProperties() { LinkProperties p = new LinkProperties(); p.addLinkAddress(makeLinkAddress()); - for (RouteInfo route : routes) { + for (RouteInfo route : mRoutes) { p.addRoute(route); } + //if empty, connectivity configures default DNS if (TextUtils.isEmpty(dns1) == false) { p.addDns(NetworkUtils.numericToInetAddress(dns1)); } else { - p.addDns(NetworkUtils.numericToInetAddress(serverAddress)); - Log.d(TAG, "empty dns1, use dhcp server as dns1!"); + Log.d(TAG, "makeLinkProperties with empty dns1!"); } if (TextUtils.isEmpty(dns2) == false) { p.addDns(NetworkUtils.numericToInetAddress(dns2)); @@ -111,11 +116,33 @@ public class DhcpInfoInternal { return p; } + /* Updates the DHCP fields that need to be retained from + * original DHCP request if the DHCP renewal shows them as + * being empty + */ + public void updateFromDhcpRequest(DhcpInfoInternal orig) { + if (orig == null) return; + + if (TextUtils.isEmpty(dns1)) { + dns1 = orig.dns1; + } + + if (TextUtils.isEmpty(dns2)) { + dns2 = orig.dns2; + } + + if (mRoutes.size() == 0) { + for (RouteInfo route : orig.getRoutes()) { + addRoute(route); + } + } + } + public String toString() { String routeString = ""; - for (RouteInfo route : routes) routeString += route.toString() + " | "; + for (RouteInfo route : mRoutes) routeString += route.toString() + " | "; return "addr: " + ipAddress + "/" + prefixLength + - " routes: " + routeString + + " mRoutes: " + routeString + " dns: " + dns1 + "," + dns2 + " dhcpServer: " + serverAddress + " leaseDuration: " + leaseDuration; diff --git a/core/java/android/net/DhcpStateMachine.java b/core/java/android/net/DhcpStateMachine.java index 445b2f7..79c9395 100644 --- a/core/java/android/net/DhcpStateMachine.java +++ b/core/java/android/net/DhcpStateMachine.java @@ -63,6 +63,9 @@ public class DhcpStateMachine extends StateMachine { private PowerManager.WakeLock mDhcpRenewWakeLock; private static final String WAKELOCK_TAG = "DHCP"; + //Remember DHCP configuration from first request + private DhcpInfoInternal mDhcpInfo; + private static final int DHCP_RENEW = 0; private static final String ACTION_DHCP_RENEW = "android.net.wifi.DHCP_RENEW"; @@ -335,9 +338,11 @@ public class DhcpStateMachine extends StateMachine { if (dhcpAction == DhcpAction.START) { Log.d(TAG, "DHCP request on " + mInterfaceName); success = NetworkUtils.runDhcp(mInterfaceName, dhcpInfoInternal); + mDhcpInfo = dhcpInfoInternal; } else if (dhcpAction == DhcpAction.RENEW) { Log.d(TAG, "DHCP renewal on " + mInterfaceName); success = NetworkUtils.runDhcpRenew(mInterfaceName, dhcpInfoInternal); + dhcpInfoInternal.updateFromDhcpRequest(mDhcpInfo); } if (success) { diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java index a5cdf70..a6635be 100644 --- a/core/java/android/net/NetworkStatsHistory.java +++ b/core/java/android/net/NetworkStatsHistory.java @@ -270,6 +270,11 @@ public class NetworkStatsHistory implements Parcelable { || entry.operations < 0) { throw new IllegalArgumentException("tried recording negative data"); } + if (entry.rxBytes == 0 && entry.rxPackets == 0 && entry.txBytes == 0 && entry.txPackets == 0 + && entry.operations == 0) { + // nothing to record; skip + return; + } // create any buckets needed by this range ensureBuckets(start, end); diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 2c875c8..9d28eff 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -353,6 +353,48 @@ public abstract class Uri implements Parcelable, Comparable<Uri> { public abstract String toString(); /** + * Return a string representation of the URI that is safe to print + * to logs and other places where PII should be avoided. + * @hide + */ + public String toSafeString() { + String scheme = getScheme(); + String ssp = getSchemeSpecificPart(); + if (scheme != null) { + if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip") + || scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto") + || scheme.equalsIgnoreCase("mailto")) { + StringBuilder builder = new StringBuilder(64); + builder.append(scheme); + builder.append(':'); + if (ssp != null) { + for (int i=0; i<ssp.length(); i++) { + char c = ssp.charAt(i); + if (c == '-' || c == '@' || c == '.') { + builder.append(c); + } else { + builder.append('x'); + } + } + } + return builder.toString(); + } + } + // Not a sensitive scheme, but let's still be conservative about + // the data we include -- only the ssp, not the query params or + // fragment, because those can often have sensitive info. + StringBuilder builder = new StringBuilder(64); + if (scheme != null) { + builder.append(scheme); + builder.append(':'); + } + if (ssp != null) { + builder.append(ssp); + } + return builder.toString(); + } + + /** * Constructs a new builder, copying the attributes from this Uri. */ public abstract Builder buildUpon(); diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java index 45e3a4c..dd9dd25 100644 --- a/core/java/android/preference/PreferenceScreen.java +++ b/core/java/android/preference/PreferenceScreen.java @@ -25,6 +25,7 @@ import android.os.Parcelable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; +import android.view.Window; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.ListAdapter; @@ -156,13 +157,13 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi // Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); - Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title) - ? com.android.internal.R.style.Theme_NoTitleBar - : com.android.internal.R.style.Theme); - dialog.setContentView(mListView); - if (!TextUtils.isEmpty(title)) { + Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); + if (TextUtils.isEmpty(title)) { + dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); + } else { dialog.setTitle(title); } + dialog.setContentView(mListView); dialog.setOnDismissListener(this); if (state != null) { dialog.onRestoreInstanceState(state); diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 5da3114..5f111eb 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -283,6 +283,17 @@ public final class MediaStore { */ public static final String IS_DRM = "is_drm"; + /** + * The width of the image/video in pixels. + * @hide + */ + public static final String WIDTH = "width"; + + /** + * The height of the image/video in pixels. + * @hide + */ + public static final String HEIGHT = "height"; } /** diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index a52d48e..1e17632 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -679,6 +679,12 @@ class TextLine { wp.getFontMetricsInt(fmi); + updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom, + previousLeading); + } + + static void updateMetrics(FontMetricsInt fmi, int previousTop, int previousAscent, + int previousDescent, int previousBottom, int previousLeading) { fmi.top = Math.min(fmi.top, previousTop); fmi.ascent = Math.min(fmi.ascent, previousAscent); fmi.descent = Math.max(fmi.descent, previousDescent); @@ -809,7 +815,28 @@ class TextLine { int textLimit = mStart + limit; if (needWidth || (c != null && runIsRtl)) { + int previousTop = 0; + int previousAscent = 0; + int previousDescent = 0; + int previousBottom = 0; + int previousLeading = 0; + + boolean needUpdateMetrics = (fmi != null); + + if (needUpdateMetrics) { + previousTop = fmi.top; + previousAscent = fmi.ascent; + previousDescent = fmi.descent; + previousBottom = fmi.bottom; + previousLeading = fmi.leading; + } + ret = replacement.getSize(wp, mText, textStart, textLimit, fmi); + + if (needUpdateMetrics) { + updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom, + previousLeading); + } } if (c != null) { diff --git a/core/java/android/text/method/Touch.java b/core/java/android/text/method/Touch.java index 3f9b945..106a801 100644 --- a/core/java/android/text/method/Touch.java +++ b/core/java/android/text/method/Touch.java @@ -35,44 +35,39 @@ public class Touch { * Y position. */ public static void scrollTo(TextView widget, Layout layout, int x, int y) { - int padding = widget.getTotalPaddingTop() + - widget.getTotalPaddingBottom(); - int top = layout.getLineForVertical(y); - int bottom = layout.getLineForVertical(y + widget.getHeight() - - padding); + final int verticalPadding = widget.getTotalPaddingTop() + widget.getTotalPaddingBottom(); + final int top = layout.getLineForVertical(y); + final int bottom = layout.getLineForVertical(y + widget.getHeight() - verticalPadding); int left = Integer.MAX_VALUE; int right = 0; - Alignment a = null; - boolean ltr = true; + Alignment a = layout.getParagraphAlignment(top); + boolean ltr = layout.getParagraphDirection(top) > 0; for (int i = top; i <= bottom; i++) { left = (int) Math.min(left, layout.getLineLeft(i)); right = (int) Math.max(right, layout.getLineRight(i)); - - if (a == null) { - a = layout.getParagraphAlignment(i); - ltr = layout.getParagraphDirection(i) > 0; - } } - padding = widget.getTotalPaddingLeft() + widget.getTotalPaddingRight(); - int width = widget.getWidth(); - int diff = 0; + final int hoizontalPadding = widget.getTotalPaddingLeft() + widget.getTotalPaddingRight(); + final int availableWidth = widget.getWidth() - hoizontalPadding; + final int actualWidth = right - left; - // align_opposite does NOT mean align_right, we need the paragraph - // direction to resolve it to left or right - if (right - left < width - padding) { + if (actualWidth < availableWidth) { if (a == Alignment.ALIGN_CENTER) { - diff = (width - padding - (right - left)) / 2; - } else if (ltr == (a == Alignment.ALIGN_OPPOSITE)) { - diff = width - padding - (right - left); + x = left - ((availableWidth - actualWidth) / 2); + } else if ((ltr && (a == Alignment.ALIGN_OPPOSITE)) || (a == Alignment.ALIGN_RIGHT)) { + // align_opposite does NOT mean align_right, we need the paragraph + // direction to resolve it to left or right + x = left - (availableWidth - actualWidth); + } else { + x = left; } + } else { + x = Math.min(x, right - availableWidth); + x = Math.max(x, left); } - x = Math.min(x, right - (width - padding) - diff); - x = Math.max(x, left - diff); - widget.scrollTo(x, y); } diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java index 5601dc5..ed976ab 100644 --- a/core/java/android/view/ActionProvider.java +++ b/core/java/android/view/ActionProvider.java @@ -58,6 +58,7 @@ import android.content.Context; * @see MenuItem#getActionProvider() */ public abstract class ActionProvider { + private SubUiVisibilityListener mSubUiVisibilityListener; /** * Creates a new instance. @@ -138,4 +139,31 @@ public abstract class ActionProvider { */ public void onPrepareSubMenu(SubMenu subMenu) { } + + /** + * Notify the system that the visibility of an action view's sub-UI such as + * an anchored popup has changed. This will affect how other system + * visibility notifications occur. + * + * @hide Pending future API approval + */ + public void subUiVisibilityChanged(boolean isVisible) { + if (mSubUiVisibilityListener != null) { + mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible); + } + } + + /** + * @hide Internal use only + */ + public void setSubUiVisibilityListener(SubUiVisibilityListener listener) { + mSubUiVisibilityListener = listener; + } + + /** + * @hide Internal use only + */ + public interface SubUiVisibilityListener { + public void onSubUiVisibilityChanged(boolean isVisible); + } } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 0dc781f..45f9da2 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -23,6 +23,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Point; +import android.os.IRemoteCallback; import android.view.IApplicationToken; import android.view.IOnKeyguardExitResult; import android.view.IRotationWatcher; @@ -115,6 +116,7 @@ interface IWindowManager boolean isKeyguardLocked(); boolean isKeyguardSecure(); boolean inKeyguardRestrictedInputMode(); + void dismissKeyguard(); void closeSystemDialogs(String reason); @@ -162,15 +164,13 @@ interface IWindowManager // These can only be called with the SET_ORIENTATION permission. /** - * Change the current screen rotation, constants as per - * {@link android.view.Surface}. - * @param rotation the intended rotation. + * Update the current screen rotation based on the current state of + * the world. * @param alwaysSendConfiguration Flag to force a new configuration to * be evaluated. This can be used when there are other parameters in * configuration that are changing. - * @param animFlags Animation flags as per {@link android.view.Surface}. */ - void setRotation(int rotation, boolean alwaysSendConfiguration, int animFlags); + void updateRotation(boolean alwaysSendConfiguration); /** * Retrieve the current screen orientation, constants as per @@ -220,7 +220,7 @@ interface IWindowManager void setPointerSpeed(int speed); /** - * Block until all windows the window manager knows about have been drawn. + * Block until the given window has been drawn to the screen. */ - void waitForAllDrawn(); + void waitForWindowDrawn(IBinder token, in IRemoteCallback callback); } diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 3880bc4..64d3d31 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -207,9 +207,6 @@ public class Surface implements Parcelable { /** Enable dithering when compositing this surface @hide */ public static final int SURFACE_DITHER = 0x04; - - /** Disable the orientation animation @hide */ - public static final int FLAGS_ORIENTATION_ANIMATION_DISABLE = 0x000000001; // The mSurfaceControl will only be present for Surfaces used by the window // server or system processes. When this class is parceled we defer to the @@ -393,7 +390,7 @@ public class Surface implements Parcelable { * set the orientation of the given display. * @param display * @param orientation - * @param flags + * @param flags Currently unused, set to 0. * @hide */ public static native void setOrientation(int display, int orientation, int flags); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f993160..3c67521 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -81,7 +81,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import java.util.WeakHashMap; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -1497,12 +1496,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal /** * Map used to store views' tags. */ - private static WeakHashMap<View, SparseArray<Object>> sTags; - - /** - * Lock used to access sTags. - */ - private static final Object sTagsLock = new Object(); + private SparseArray<Object> mKeyedTags; /** * The next available accessiiblity id. @@ -3900,6 +3894,12 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * Note: Called from the default {@link AccessibilityDelegate}. */ boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) { + // Do not populate text to scroll events. They describe position change + // and usually come from container with a lot of text which is not very + // informative for accessibility purposes. Also they are fired frequently. + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { + return true; + } onPopulateAccessibilityEvent(event); return false; } @@ -12236,14 +12236,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * @see #getTag() */ public Object getTag(int key) { - SparseArray<Object> tags = null; - synchronized (sTagsLock) { - if (sTags != null) { - tags = sTags.get(this); - } - } - - if (tags != null) return tags.get(key); + if (mKeyedTags != null) return mKeyedTags.get(key); return null; } @@ -12276,7 +12269,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal + "resource id."); } - setTagInternal(this, key, tag); + setKeyedTag(key, tag); } /** @@ -12291,27 +12284,15 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal + "resource id."); } - setTagInternal(this, key, tag); + setKeyedTag(key, tag); } - private static void setTagInternal(View view, int key, Object tag) { - SparseArray<Object> tags = null; - synchronized (sTagsLock) { - if (sTags == null) { - sTags = new WeakHashMap<View, SparseArray<Object>>(); - } else { - tags = sTags.get(view); - } - } - - if (tags == null) { - tags = new SparseArray<Object>(2); - synchronized (sTagsLock) { - sTags.put(view, tags); - } + private void setKeyedTag(int key, Object tag) { + if (mKeyedTags == null) { + mKeyedTags = new SparseArray<Object>(); } - tags.put(key, tag); + mKeyedTags.put(key, tag); } /** diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index c7b59b8..a29cf13 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -290,6 +290,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager private static final int FLAG_SPLIT_MOTION_EVENTS = 0x200000; /** + * When set, this ViewGroup will not dispatch onAttachedToWindow calls + * to children when adding new views. This is used to prevent multiple + * onAttached calls when a ViewGroup adds children in its own onAttached method. + */ + private static final int FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW = 0x400000; + + /** * Indicates which types of drawing caches are to be kept in memory. * This field should be made private, so it is hidden from the SDK. * {@hide} @@ -2154,8 +2161,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager */ @Override void dispatchAttachedToWindow(AttachInfo info, int visibility) { + mGroupFlags |= FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW; super.dispatchAttachedToWindow(info, visibility); + mGroupFlags &= ~FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW; + visibility |= mViewFlags & VISIBILITY_MASK; + final int count = mChildrenCount; final View[] children = mChildren; for (int i = 0; i < count; i++) { @@ -2165,13 +2176,15 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager @Override boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) { - // We first get a chance to populate the event. - super.dispatchPopulateAccessibilityEventInternal(event); + boolean handled = super.dispatchPopulateAccessibilityEventInternal(event); + if (handled) { + return handled; + } // Let our children have a shot in populating the event. for (int i = 0, count = getChildCount(); i < count; i++) { View child = getChildAt(i); if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { - boolean handled = getChildAt(i).dispatchPopulateAccessibilityEvent(event); + handled = getChildAt(i).dispatchPopulateAccessibilityEvent(event); if (handled) { return handled; } @@ -3321,7 +3334,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } AttachInfo ai = mAttachInfo; - if (ai != null) { + if (ai != null && (mGroupFlags & FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW) == 0) { boolean lastKeepOn = ai.mKeepScreenOn; ai.mKeepScreenOn = false; child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK)); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 4611984..9cb4e5e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1054,7 +1054,6 @@ public final class ViewRootImpl extends Handler implements ViewParent, || attachInfo.mSystemUiVisibility != oldVis || attachInfo.mHasSystemUiListeners) { params = lp; - windowAttributesChanges |= WindowManager.LayoutParams.BUFFER_CHANGED; } } diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java index fb87e23..122865e 100644 --- a/core/java/android/view/VolumePanel.java +++ b/core/java/android/view/VolumePanel.java @@ -34,10 +34,12 @@ import android.media.ToneGenerator; import android.net.Uri; import android.os.Handler; import android.os.Message; +import android.os.RemoteException; import android.os.Vibrator; import android.provider.Settings; import android.provider.Settings.System; import android.util.Log; +import android.view.WindowManager.LayoutParams; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; @@ -175,20 +177,8 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie View view = mView = inflater.inflate(R.layout.volume_adjust, null); mView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { - // Dismiss the dialog if the user touches outside the visible area. This is not - // handled by the usual dialog dismissing code because there is a region above - // the panel (marginTop) that is still within the dialog. - if (event.getAction() == MotionEvent.ACTION_DOWN) { - int x = (int) event.getX(); - int y = (int) event.getY(); - if (x < mPanel.getLeft() || x > mPanel.getRight() || y < mPanel.getTop() - || y > mPanel.getBottom()) { - forceTimeout(); - return true; - } - } resetTimeout(); - return true; + return false; } }); mPanel = (ViewGroup) mView.findViewById(R.id.visible_panel); @@ -196,7 +186,15 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie mMoreButton = (ImageView) mView.findViewById(R.id.expand_button); mDivider = (ImageView) mView.findViewById(R.id.expand_button_divider); - mDialog = new Dialog(context, R.style.Theme_Panel_Volume); + mDialog = new Dialog(context, R.style.Theme_Panel_Volume) { + public boolean onTouchEvent(MotionEvent event) { + if (isShowing() && event.getAction() == MotionEvent.ACTION_OUTSIDE) { + forceTimeout(); + return true; + } + return false; + } + }; mDialog.setTitle("Volume control"); // No need to localize mDialog.setContentView(mView); mDialog.setOnDismissListener(new OnDismissListener() { @@ -208,11 +206,17 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie // Change some window properties Window window = mDialog.getWindow(); window.setGravity(Gravity.TOP); - WindowManager.LayoutParams lp = window.getAttributes(); + LayoutParams lp = window.getAttributes(); lp.token = null; - lp.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; + // Offset from the top + lp.y = mContext.getResources().getDimensionPixelOffset( + com.android.internal.R.dimen.volume_panel_top); + lp.type = LayoutParams.TYPE_VOLUME_OVERLAY; + lp.width = LayoutParams.WRAP_CONTENT; + lp.height = LayoutParams.WRAP_CONTENT; window.setAttributes(lp); - window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL + | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); mToneGenerators = new ToneGenerator[AudioSystem.getNumStreamTypes()]; mVibrator = new Vibrator(); diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 980e454..4f67675 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -375,12 +375,6 @@ public interface WindowManagerPolicy { /** Screen turned off because of proximity sensor */ public final int OFF_BECAUSE_OF_PROX_SENSOR = 4; - /** - * Magic constant to {@link IWindowManager#setRotation} to not actually - * modify the rotation. - */ - public final int USE_LAST_ROTATION = -1000; - /** When not otherwise specified by the activity's screenOrientation, rotation should be * determined by the system (that is, using sensors). */ public final int USER_ROTATION_FREE = 0; @@ -772,15 +766,26 @@ public interface WindowManagerPolicy { */ public void screenTurnedOff(int why); + public interface ScreenOnListener { + void onScreenOn(); + }; + /** - * Called after the screen turns on. + * Called when the power manager would like to turn the screen on. + * Must call back on the listener to tell it when the higher-level system + * is ready for the screen to go on (i.e. the lock screen is shown). */ - public void screenTurnedOn(); + public void screenTurningOn(ScreenOnListener screenOnListener); /** - * Return whether the screen is currently on. + * Return whether the screen is about to turn on or is currently on. */ - public boolean isScreenOn(); + public boolean isScreenOnEarly(); + + /** + * Return whether the screen is fully turned on. + */ + public boolean isScreenOnFully(); /** * Tell the policy that the lid switch has changed state. @@ -845,22 +850,42 @@ public interface WindowManagerPolicy { public boolean inKeyguardRestrictedKeyInputMode(); /** - * Given an orientation constant - * ({@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE - * ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE} or - * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_PORTRAIT - * ActivityInfo.SCREEN_ORIENTATION_PORTRAIT}), return a surface - * rotation. + * Ask the policy to dismiss the keyguard, if it is currently shown. */ - public int rotationForOrientationLw(int orientation, int lastRotation, - boolean displayEnabled); - + public void dismissKeyguardLw(); + /** - * Return the currently locked screen rotation, if any. Return - * Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, or - * Surface.ROTATION_270 if locked; return -1 if not locked. + * Given an orientation constant, returns the appropriate surface rotation, + * taking into account sensors, docking mode, rotation lock, and other factors. + * + * @param orientation An orientation constant, such as + * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}. + * @param lastRotation The most recently used rotation. + * @return The surface rotation to use. + */ + public int rotationForOrientationLw(int orientation, int lastRotation); + + /** + * Given an orientation constant and a rotation, returns true if the rotation + * has compatible metrics to the requested orientation. For example, if + * the application requested landscape and got seascape, then the rotation + * has compatible metrics; if the application requested portrait and got landscape, + * then the rotation has incompatible metrics; if the application did not specify + * a preference, then anything goes. + * + * @param orientation An orientation constant, such as + * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}. + * @param rotation The rotation to check. + * @return True if the rotation is compatible with the requested orientation. + */ + public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation); + + /** + * Called by the window manager when the rotation changes. + * + * @param rotation The new rotation. */ - public int getLockedRotationLw(); + public void setRotationLw(int rotation); /** * Called when the system is mostly done booting to determine whether diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java index 76b47ca..c3c74a7 100755 --- a/core/java/android/view/WindowOrientationListener.java +++ b/core/java/android/view/WindowOrientationListener.java @@ -26,7 +26,7 @@ import android.util.Slog; /** * A special helper class used by the WindowManager - * for receiving notifications from the SensorManager when + * for receiving notifications from the SensorManager when * the orientation of the device has changed. * * NOTE: If changing anything here, please run the API demo @@ -54,6 +54,7 @@ public abstract class WindowOrientationListener { private Sensor mSensor; private SensorEventListenerImpl mSensorEventListener; boolean mLogEnabled; + int mCurrentRotation = -1; /** * Creates a new WindowOrientationListener. @@ -117,15 +118,27 @@ public abstract class WindowOrientationListener { } /** - * Gets the current orientation. - * @param lastRotation - * @return + * Sets the current rotation. + * + * @param rotation The current rotation. + */ + public void setCurrentRotation(int rotation) { + mCurrentRotation = rotation; + } + + /** + * Gets the proposed rotation. + * + * This method only returns a rotation if the orientation listener is certain + * of its proposal. If the rotation is indeterminate, returns -1. + * + * @return The proposed rotation, or -1 if unknown. */ - public int getCurrentRotation(int lastRotation) { + public int getProposedRotation() { if (mEnabled) { - return mSensorEventListener.getCurrentRotation(lastRotation); + return mSensorEventListener.getProposedRotation(); } - return lastRotation; + return -1; } /** @@ -138,10 +151,14 @@ public abstract class WindowOrientationListener { /** * Called when the rotation view of the device has changed. * + * This method is called whenever the orientation becomes certain of an orientation. + * It is called each time the orientation determination transitions from being + * uncertain to being certain again, even if it is the same orientation as before. + * * @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants. * @see Surface */ - public abstract void onOrientationChanged(int rotation); + public abstract void onProposedRotationChanged(int rotation); /** * Enables or disables the window orientation listener logging for use with @@ -183,23 +200,8 @@ public abstract class WindowOrientationListener { * to the corresponding orientation. These thresholds have some hysteresis built-in * to avoid oscillations between adjacent orientations. * - * - Use the magnitude to judge the confidence of the orientation. - * Under ideal conditions, the magnitude should equal to that of gravity. When it - * differs significantly, we know the device is under external acceleration and - * we can't trust the data. - * - * - Use the tilt angle to judge the confidence of the orientation. - * When the tilt angle is high in absolute value then the device is nearly flat - * so small physical movements produce large changes in orientation angle. - * This can be the case when the device is being picked up from a table. - * - * - Use the orientation angle to judge the confidence of the orientation. - * The close the orientation angle is to the canonical orientation angle, the better. - * - * - Based on the aggregate confidence, we determine how long we want to wait for - * the new orientation to settle. This is accomplished by integrating the confidence - * for each orientation over time. When a threshold integration sum is reached - * then we actually change orientations. + * - Wait for the device to settle for a little bit. Once that happens, issue the + * new orientation proposal. * * Details are explained inline. */ @@ -212,22 +214,8 @@ public abstract class WindowOrientationListener { private static final int ACCELEROMETER_DATA_Y = 1; private static final int ACCELEROMETER_DATA_Z = 2; - // Rotation constants. - // These are the same as Surface rotation constants with the addition of a 5th - // unknown state when we are not confident about the proporsed orientation. - // One important property of these constants is that they are equal to the - // orientation angle itself divided by 90. We use this fact to map - // back and forth between orientation angles and rotation values. - private static final int ROTATION_UNKNOWN = -1; - //private static final int ROTATION_0 = Surface.ROTATION_0; // 0 - //private static final int ROTATION_90 = Surface.ROTATION_90; // 1 - //private static final int ROTATION_180 = Surface.ROTATION_180; // 2 - //private static final int ROTATION_270 = Surface.ROTATION_270; // 3 - private final WindowOrientationListener mOrientationListener; - private int mRotation = ROTATION_UNKNOWN; - /* State for first order low-pass filtering of accelerometer data. * See http://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization for * signal processing background. @@ -236,6 +224,24 @@ public abstract class WindowOrientationListener { private long mLastTimestamp = Long.MAX_VALUE; // in nanoseconds private float mLastFilteredX, mLastFilteredY, mLastFilteredZ; + // The current proposal. We wait for the proposal to be stable for a + // certain amount of time before accepting it. + // + // The basic idea is to ignore intermediate poses of the device while the + // user is picking up, putting down or turning the device. + private int mProposalRotation; + private long mProposalAgeMS; + + // A historical trace of tilt and orientation angles. Used to determine whether + // the device posture has settled down. + private static final int HISTORY_SIZE = 20; + private int mHistoryIndex; // index of most recent sample + private int mHistoryLength; // length of historical trace + private final long[] mHistoryTimestampMS = new long[HISTORY_SIZE]; + private final float[] mHistoryMagnitudes = new float[HISTORY_SIZE]; + private final int[] mHistoryTiltAngles = new int[HISTORY_SIZE]; + private final int[] mHistoryOrientationAngles = new int[HISTORY_SIZE]; + // The maximum sample inter-arrival time in milliseconds. // If the acceleration samples are further apart than this amount in time, we reset the // state of the low-pass filter and orientation properties. This helps to handle @@ -243,24 +249,26 @@ public abstract class WindowOrientationListener { // a significant gap in samples. private static final float MAX_FILTER_DELTA_TIME_MS = 1000; - // The acceleration filter cutoff frequency. - // This is the frequency at which signals are attenuated by 3dB (half the passband power). + // The acceleration filter time constant. + // + // This time constant is used to tune the acceleration filter such that + // impulses and vibrational noise (think car dock) is suppressed before we + // try to calculate the tilt and orientation angles. + // + // The filter time constant is related to the filter cutoff frequency, which is the + // frequency at which signals are attenuated by 3dB (half the passband power). // Each successive octave beyond this frequency is attenuated by an additional 6dB. // - // We choose the cutoff frequency such that impulses and vibrational noise - // (think car dock) is suppressed. However, this filtering does not eliminate - // all possible sources of orientation ambiguity so we also rely on a dynamic - // settle time for establishing a new orientation. Filtering adds latency - // inversely proportional to the cutoff frequency so we don't want to make - // it too small or we can lose hundreds of milliseconds of responsiveness. - private static final float FILTER_CUTOFF_FREQUENCY_HZ = 1f; - private static final float FILTER_TIME_CONSTANT_MS = (float)(500.0f - / (Math.PI * FILTER_CUTOFF_FREQUENCY_HZ)); // t = 1 / (2pi * Fc) * 1000ms - - // The filter gain. - // We choose a value slightly less than unity to avoid numerical instabilities due - // to floating-point error accumulation. - private static final float FILTER_GAIN = 0.999f; + // Given a time constant t in seconds, the filter cutoff frequency Fc in Hertz + // is given by Fc = 1 / (2pi * t). + // + // The higher the time constant, the lower the cutoff frequency, so more noise + // will be suppressed. + // + // Filtering adds latency proportional the time constant (inversely proportional + // to the cutoff frequency) so we don't want to make the time constant too + // large or we can lose responsiveness. + private static final float FILTER_TIME_CONSTANT_MS = 100.0f; /* State for orientation detection. */ @@ -298,10 +306,10 @@ public abstract class WindowOrientationListener { // The ideal tilt angle is 0 (when the device is vertical) so the limits establish // how close to vertical the device must be in order to change orientation. private static final int[][] TILT_TOLERANCE = new int[][] { - /* ROTATION_0 */ { -20, 75 }, - /* ROTATION_90 */ { -20, 70 }, - /* ROTATION_180 */ { -20, 65 }, - /* ROTATION_270 */ { -20, 70 } + /* ROTATION_0 */ { -20, 70 }, + /* ROTATION_90 */ { -20, 60 }, + /* ROTATION_180 */ { -20, 50 }, + /* ROTATION_270 */ { -20, 60 } }; // The gap angle in degrees between adjacent orientation angles for hysteresis. @@ -309,41 +317,31 @@ public abstract class WindowOrientationListener { // adjacent orientation. No orientation proposal is made when the orientation // angle is within the gap between the current orientation and the adjacent // orientation. - private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 30; - - // The confidence scale factors for angle, tilt and magnitude. - // When the distance between the actual value and the ideal value is the - // specified delta, orientation transitions will take twice as long as they would - // in the ideal case. Increasing or decreasing the delta has an exponential effect - // on each factor's influence over the transition time. + private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 45; - // Transition takes 2x longer when angle is 30 degrees from ideal orientation angle. - private static final float ORIENTATION_ANGLE_CONFIDENCE_SCALE = - confidenceScaleFromDelta(30); + // The number of milliseconds for which the device posture must be stable + // before we perform an orientation change. If the device appears to be rotating + // (being picked up, put down) then we keep waiting until it settles. + private static final int SETTLE_TIME_MS = 200; - // Transition takes 2x longer when tilt is 60 degrees from vertical. - private static final float TILT_ANGLE_CONFIDENCE_SCALE = confidenceScaleFromDelta(60); + // The maximum change in magnitude that can occur during the settle time. + // Tuning this constant particularly helps to filter out situations where the + // device is being picked up or put down by the user. + private static final float SETTLE_MAGNITUDE_MAX_DELTA = + SensorManager.STANDARD_GRAVITY * 0.2f; - // Transition takes 2x longer when acceleration is 0.5 Gs. - private static final float MAGNITUDE_CONFIDENCE_SCALE = confidenceScaleFromDelta( - SensorManager.STANDARD_GRAVITY * 0.5f); + // The maximum change in tilt angle that can occur during the settle time. + private static final int SETTLE_TILT_ANGLE_MAX_DELTA = 5; - // The number of milliseconds for which a new orientation must be stable before - // we perform an orientation change under ideal conditions. It will take - // proportionally longer than this to effect an orientation change when - // the proposed orientation confidence is low. - private static final float ORIENTATION_SETTLE_TIME_MS = 250; - - // The confidence that we have abount effecting each orientation change. - // When one of these values exceeds 1.0, we have determined our new orientation! - private float mConfidence[] = new float[4]; + // The maximum change in orientation angle that can occur during the settle time. + private static final int SETTLE_ORIENTATION_ANGLE_MAX_DELTA = 5; public SensorEventListenerImpl(WindowOrientationListener orientationListener) { mOrientationListener = orientationListener; } - public int getCurrentRotation(int lastRotation) { - return mRotation != ROTATION_UNKNOWN ? mRotation : lastRotation; + public int getProposedRotation() { + return mProposalAgeMS >= SETTLE_TIME_MS ? mProposalRotation : -1; } @Override @@ -369,20 +367,18 @@ public abstract class WindowOrientationListener { // Reset the orientation listener state if the samples are too far apart in time // or when we see values of (0, 0, 0) which indicates that we polled the // accelerometer too soon after turning it on and we don't have any data yet. - final float timeDeltaMS = (event.timestamp - mLastTimestamp) * 0.000001f; + final long now = event.timestamp; + final float timeDeltaMS = (now - mLastTimestamp) * 0.000001f; boolean skipSample; if (timeDeltaMS <= 0 || timeDeltaMS > MAX_FILTER_DELTA_TIME_MS || (x == 0 && y == 0 && z == 0)) { if (log) { Slog.v(TAG, "Resetting orientation listener."); } - for (int i = 0; i < 4; i++) { - mConfidence[i] = 0; - } + clearProposal(); skipSample = true; } else { - final float alpha = timeDeltaMS - / (FILTER_TIME_CONSTANT_MS + timeDeltaMS) * FILTER_GAIN; + final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS + timeDeltaMS); x = alpha * (x - mLastFilteredX) + mLastFilteredX; y = alpha * (y - mLastFilteredY) + mLastFilteredY; z = alpha * (z - mLastFilteredZ) + mLastFilteredZ; @@ -392,17 +388,13 @@ public abstract class WindowOrientationListener { } skipSample = false; } - mLastTimestamp = event.timestamp; + mLastTimestamp = now; mLastFilteredX = x; mLastFilteredY = y; mLastFilteredZ = z; - boolean orientationChanged = false; + final int oldProposedRotation = getProposedRotation(); if (!skipSample) { - // Determine a proposed orientation based on the currently available data. - int proposedOrientation = ROTATION_UNKNOWN; - float combinedConfidence = 1.0f; - // Calculate the magnitude of the acceleration vector. final float magnitude = (float) Math.sqrt(x * x + y * y + z * z); if (magnitude < MIN_ACCELERATION_MAGNITUDE @@ -411,6 +403,7 @@ public abstract class WindowOrientationListener { Slog.v(TAG, "Ignoring sensor data, magnitude out of range: " + "magnitude=" + magnitude); } + clearProposal(); } else { // Calculate the tilt angle. // This is the angle between the up vector and the x-y plane (the plane of @@ -418,123 +411,82 @@ public abstract class WindowOrientationListener { // -90 degrees: screen horizontal and facing the ground (overhead) // 0 degrees: screen vertical // 90 degrees: screen horizontal and facing the sky (on table) - final int tiltAngle = (int) Math.round( - Math.asin(z / magnitude) * RADIANS_TO_DEGREES); - - // If the tilt angle is too close to horizontal then we cannot determine - // the orientation angle of the screen. - if (Math.abs(tiltAngle) > MAX_TILT) { - if (log) { - Slog.v(TAG, "Ignoring sensor data, tilt angle too high: " - + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle); - } - } else { - // Calculate the orientation angle. - // This is the angle between the x-y projection of the up vector onto - // the +y-axis, increasing clockwise in a range of [0, 360] degrees. - int orientationAngle = (int) Math.round( - -Math.atan2(-x, y) * RADIANS_TO_DEGREES); - if (orientationAngle < 0) { - // atan2 returns [-180, 180]; normalize to [0, 360] - orientationAngle += 360; - } - - // Find the nearest orientation. - // An orientation of 0 can have a nearest angle of 0 or 360 depending - // on which is closer to the measured orientation angle. We leave the - // nearest angle at 360 in that case since it makes the delta calculation - // for orientation angle confidence easier below. - int nearestOrientation = (orientationAngle + 45) / 90; - int nearestOrientationAngle = nearestOrientation * 90; - if (nearestOrientation == 4) { - nearestOrientation = 0; - } - - // Determine the proposed orientation. - // The confidence of the proposal is 1.0 when it is ideal and it - // decays exponentially as the proposal moves further from the ideal - // angle, tilt and magnitude of the proposed orientation. - if (isTiltAngleAcceptable(nearestOrientation, tiltAngle) - && isOrientationAngleAcceptable(nearestOrientation, - orientationAngle)) { - proposedOrientation = nearestOrientation; - - final float idealOrientationAngle = nearestOrientationAngle; - final float orientationConfidence = confidence(orientationAngle, - idealOrientationAngle, ORIENTATION_ANGLE_CONFIDENCE_SCALE); - - final float idealTiltAngle = 0; - final float tiltConfidence = confidence(tiltAngle, - idealTiltAngle, TILT_ANGLE_CONFIDENCE_SCALE); - - final float idealMagnitude = SensorManager.STANDARD_GRAVITY; - final float magnitudeConfidence = confidence(magnitude, - idealMagnitude, MAGNITUDE_CONFIDENCE_SCALE); - - combinedConfidence = orientationConfidence - * tiltConfidence * magnitudeConfidence; - - if (log) { - Slog.v(TAG, "Proposal: " - + "magnitude=" + magnitude - + ", tiltAngle=" + tiltAngle - + ", orientationAngle=" + orientationAngle - + ", proposedOrientation=" + proposedOrientation - + ", combinedConfidence=" + combinedConfidence - + ", orientationConfidence=" + orientationConfidence - + ", tiltConfidence=" + tiltConfidence - + ", magnitudeConfidence=" + magnitudeConfidence); - } - } else { - if (log) { - Slog.v(TAG, "Ignoring sensor data, no proposal: " - + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle - + ", orientationAngle=" + orientationAngle); - } - } - } - } - - // Sum up the orientation confidence weights. - // Detect an orientation change when the sum reaches 1.0. - final float confidenceAmount = combinedConfidence * timeDeltaMS - / ORIENTATION_SETTLE_TIME_MS; - for (int i = 0; i < 4; i++) { - if (i == proposedOrientation) { - mConfidence[i] += confidenceAmount; - if (mConfidence[i] >= 1.0f) { - mConfidence[i] = 1.0f; - - if (i != mRotation) { - if (log) { - Slog.v(TAG, "Orientation changed! rotation=" + i); - } - mRotation = i; - orientationChanged = true; - } + final int tiltAngle = (int) Math.round( + Math.asin(z / magnitude) * RADIANS_TO_DEGREES); + + // If the tilt angle is too close to horizontal then we cannot determine + // the orientation angle of the screen. + if (Math.abs(tiltAngle) > MAX_TILT) { + if (log) { + Slog.v(TAG, "Ignoring sensor data, tilt angle too high: " + + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle); } + clearProposal(); } else { - mConfidence[i] -= confidenceAmount; - if (mConfidence[i] < 0.0f) { - mConfidence[i] = 0.0f; + // Calculate the orientation angle. + // This is the angle between the x-y projection of the up vector onto + // the +y-axis, increasing clockwise in a range of [0, 360] degrees. + int orientationAngle = (int) Math.round( + -Math.atan2(-x, y) * RADIANS_TO_DEGREES); + if (orientationAngle < 0) { + // atan2 returns [-180, 180]; normalize to [0, 360] + orientationAngle += 360; + } + + // Find the nearest rotation. + int nearestRotation = (orientationAngle + 45) / 90; + if (nearestRotation == 4) { + nearestRotation = 0; + } + + // Determine the proposed orientation. + // The confidence of the proposal is 1.0 when it is ideal and it + // decays exponentially as the proposal moves further from the ideal + // angle, tilt and magnitude of the proposed orientation. + if (!isTiltAngleAcceptable(nearestRotation, tiltAngle) + || !isOrientationAngleAcceptable(nearestRotation, + orientationAngle)) { + if (log) { + Slog.v(TAG, "Ignoring sensor data, no proposal: " + + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle + + ", orientationAngle=" + orientationAngle); + } + clearProposal(); + } else { + if (log) { + Slog.v(TAG, "Proposal: " + + "magnitude=" + magnitude + + ", tiltAngle=" + tiltAngle + + ", orientationAngle=" + orientationAngle + + ", proposalRotation=" + mProposalRotation); + } + updateProposal(nearestRotation, now / 1000000L, + magnitude, tiltAngle, orientationAngle); } } } } // Write final statistics about where we are in the orientation detection process. + final int proposedRotation = getProposedRotation(); if (log) { - Slog.v(TAG, "Result: rotation=" + mRotation - + ", confidence=[" - + mConfidence[0] + ", " - + mConfidence[1] + ", " - + mConfidence[2] + ", " - + mConfidence[3] + "], timeDeltaMS=" + timeDeltaMS); + final float proposalConfidence = Math.min( + mProposalAgeMS * 1.0f / SETTLE_TIME_MS, 1.0f); + Slog.v(TAG, "Result: currentRotation=" + mOrientationListener.mCurrentRotation + + ", proposedRotation=" + proposedRotation + + ", timeDeltaMS=" + timeDeltaMS + + ", proposalRotation=" + mProposalRotation + + ", proposalAgeMS=" + mProposalAgeMS + + ", proposalConfidence=" + proposalConfidence); } // Tell the listener. - if (orientationChanged) { - mOrientationListener.onOrientationChanged(mRotation); + if (proposedRotation != oldProposedRotation && proposedRotation >= 0) { + if (log) { + Slog.v(TAG, "Proposed rotation changed! proposedRotation=" + proposedRotation + + ", oldProposedRotation=" + oldProposedRotation); + } + mOrientationListener.onProposedRotationChanged(proposedRotation); } } @@ -542,33 +494,34 @@ public abstract class WindowOrientationListener { * Returns true if the tilt angle is acceptable for a proposed * orientation transition. */ - private boolean isTiltAngleAcceptable(int proposedOrientation, + private boolean isTiltAngleAcceptable(int proposedRotation, int tiltAngle) { - return tiltAngle >= TILT_TOLERANCE[proposedOrientation][0] - && tiltAngle <= TILT_TOLERANCE[proposedOrientation][1]; + return tiltAngle >= TILT_TOLERANCE[proposedRotation][0] + && tiltAngle <= TILT_TOLERANCE[proposedRotation][1]; } /** * Returns true if the orientation angle is acceptable for a proposed * orientation transition. + * * This function takes into account the gap between adjacent orientations * for hysteresis. */ - private boolean isOrientationAngleAcceptable(int proposedOrientation, - int orientationAngle) { - final int currentOrientation = mRotation; - + private boolean isOrientationAngleAcceptable(int proposedRotation, int orientationAngle) { // If there is no current rotation, then there is no gap. - if (currentOrientation != ROTATION_UNKNOWN) { - // If the proposed orientation is the same or is counter-clockwise adjacent, + // The gap is used only to introduce hysteresis among advertised orientation + // changes to avoid flapping. + final int currentRotation = mOrientationListener.mCurrentRotation; + if (currentRotation >= 0) { + // If the proposed rotation is the same or is counter-clockwise adjacent, // then we set a lower bound on the orientation angle. - // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_90, + // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_90, // then we want to check orientationAngle > 45 + GAP / 2. - if (proposedOrientation == currentOrientation - || proposedOrientation == (currentOrientation + 1) % 4) { - int lowerBound = proposedOrientation * 90 - 45 + if (proposedRotation == currentRotation + || proposedRotation == (currentRotation + 1) % 4) { + int lowerBound = proposedRotation * 90 - 45 + ADJACENT_ORIENTATION_ANGLE_GAP / 2; - if (proposedOrientation == 0) { + if (proposedRotation == 0) { if (orientationAngle >= 315 && orientationAngle < lowerBound + 360) { return false; } @@ -579,15 +532,15 @@ public abstract class WindowOrientationListener { } } - // If the proposed orientation is the same or is clockwise adjacent, + // If the proposed rotation is the same or is clockwise adjacent, // then we set an upper bound on the orientation angle. - // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_270, + // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_270, // then we want to check orientationAngle < 315 - GAP / 2. - if (proposedOrientation == currentOrientation - || proposedOrientation == (currentOrientation + 3) % 4) { - int upperBound = proposedOrientation * 90 + 45 + if (proposedRotation == currentRotation + || proposedRotation == (currentRotation + 3) % 4) { + int upperBound = proposedRotation * 90 + 45 - ADJACENT_ORIENTATION_ANGLE_GAP / 2; - if (proposedOrientation == 0) { + if (proposedRotation == 0) { if (orientationAngle <= 45 && orientationAngle > upperBound) { return false; } @@ -601,21 +554,58 @@ public abstract class WindowOrientationListener { return true; } - /** - * Calculate an exponentially weighted confidence value in the range [0.0, 1.0]. - * The further the value is from the target, the more the confidence trends to 0. - */ - private static float confidence(float value, float target, float scale) { - return (float) Math.exp(-Math.abs(value - target) * scale); + private void clearProposal() { + mProposalRotation = -1; + mProposalAgeMS = 0; } - /** - * Calculate a scale factor for the confidence weight exponent. - * The scale value is chosen such that confidence(value, target, scale) == 0.5 - * whenever abs(value - target) == cutoffDelta. - */ - private static float confidenceScaleFromDelta(float cutoffDelta) { - return (float) -Math.log(0.5) / cutoffDelta; + private void updateProposal(int rotation, long timestampMS, + float magnitude, int tiltAngle, int orientationAngle) { + if (mProposalRotation != rotation) { + mProposalRotation = rotation; + mHistoryIndex = 0; + mHistoryLength = 0; + } + + final int index = mHistoryIndex; + mHistoryTimestampMS[index] = timestampMS; + mHistoryMagnitudes[index] = magnitude; + mHistoryTiltAngles[index] = tiltAngle; + mHistoryOrientationAngles[index] = orientationAngle; + mHistoryIndex = (index + 1) % HISTORY_SIZE; + if (mHistoryLength < HISTORY_SIZE) { + mHistoryLength += 1; + } + + long age = 0; + for (int i = 1; i < mHistoryLength; i++) { + final int olderIndex = (index + HISTORY_SIZE - i) % HISTORY_SIZE; + if (Math.abs(mHistoryMagnitudes[olderIndex] - magnitude) + > SETTLE_MAGNITUDE_MAX_DELTA) { + break; + } + if (angleAbsoluteDelta(mHistoryTiltAngles[olderIndex], + tiltAngle) > SETTLE_TILT_ANGLE_MAX_DELTA) { + break; + } + if (angleAbsoluteDelta(mHistoryOrientationAngles[olderIndex], + orientationAngle) > SETTLE_ORIENTATION_ANGLE_MAX_DELTA) { + break; + } + age = timestampMS - mHistoryTimestampMS[olderIndex]; + if (age >= SETTLE_TIME_MS) { + break; + } + } + mProposalAgeMS = age; + } + + private static int angleAbsoluteDelta(int a, int b) { + int delta = Math.abs(a - b); + if (delta > 180) { + delta = 360 - delta; + } + return delta; } } } diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java index 01587aa..b06c112 100644 --- a/core/java/android/view/textservice/TextServicesManager.java +++ b/core/java/android/view/textservice/TextServicesManager.java @@ -223,7 +223,7 @@ public final class TextServicesManager { try { sService.setSpellCheckerEnabled(enabled); } catch (RemoteException e) { - Log.e(TAG, "Error in setSpellCheckerSubtype:" + e); + Log.e(TAG, "Error in setSpellCheckerEnabled:" + e); } } @@ -234,7 +234,7 @@ public final class TextServicesManager { try { return sService.isSpellCheckerEnabled(); } catch (RemoteException e) { - Log.e(TAG, "Error in setSpellCheckerSubtype:" + e); + Log.e(TAG, "Error in isSpellCheckerEnabled:" + e); return false; } } diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java index 313f755..a699800 100644 --- a/core/java/android/webkit/CookieSyncManager.java +++ b/core/java/android/webkit/CookieSyncManager.java @@ -88,6 +88,10 @@ public final class CookieSyncManager extends WebSyncManager { */ public static synchronized CookieSyncManager createInstance( Context context) { + if (context == null) { + throw new IllegalArgumentException("Invalid context argument"); + } + JniUtil.setContext(context); Context appContext = context.getApplicationContext(); if (sRef == null) { diff --git a/core/java/android/webkit/JniUtil.java b/core/java/android/webkit/JniUtil.java index ef1641d..7759ff3 100644 --- a/core/java/android/webkit/JniUtil.java +++ b/core/java/android/webkit/JniUtil.java @@ -39,25 +39,21 @@ class JniUtil { private static Boolean sUseChromiumHttpStack; private static Context sContext; - private static boolean initialized = false; - private static void checkInitialized() { - if (!initialized) { + if (sContext == null) { throw new IllegalStateException("Call CookieSyncManager::createInstance() or create a webview before using this class"); } } protected static synchronized void setContext(Context context) { - if (initialized) + if (sContext != null) { return; + } sContext = context.getApplicationContext(); - initialized = true; } protected static synchronized Context getContext() { - if (!initialized) - return null; return sContext; } @@ -68,8 +64,9 @@ class JniUtil { private static synchronized String getDatabaseDirectory() { checkInitialized(); - if (sDatabaseDirectory == null) + if (sDatabaseDirectory == null) { sDatabaseDirectory = sContext.getDatabasePath("dummy").getParent(); + } return sDatabaseDirectory; } @@ -81,8 +78,9 @@ class JniUtil { private static synchronized String getCacheDirectory() { checkInitialized(); - if (sCacheDirectory == null) + if (sCacheDirectory == null) { sCacheDirectory = sContext.getCacheDir().getAbsolutePath(); + } return sCacheDirectory; } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 600c899..139f9f3 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -644,7 +644,7 @@ public class WebView extends AbsoluteLayout private Drawable mSelectHandleLeft; private Drawable mSelectHandleRight; - static final boolean USE_WEBKIT_RINGS = true; + static final boolean USE_WEBKIT_RINGS = false; // the color used to highlight the touch rectangles private static final int HIGHLIGHT_COLOR = 0x6633b5e5; // the round corner for the highlight path @@ -730,6 +730,7 @@ public class WebView extends AbsoluteLayout static final int SELECT_AT = 135; static final int SCREEN_ON = 136; static final int ENTER_FULLSCREEN_VIDEO = 137; + static final int UPDATE_SELECTION = 138; private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = SET_TOUCH_HIGHLIGHT_RECTS; @@ -1054,6 +1055,10 @@ public class WebView extends AbsoluteLayout super(context, attrs, defStyle); checkThread(); + if (context == null) { + throw new IllegalArgumentException("Invalid context argument"); + } + // Used by the chrome stack to find application paths JniUtil.setContext(context); @@ -1803,6 +1808,8 @@ public class WebView extends AbsoluteLayout /** * Restore the display data that was save in {@link #savePicture}. Used in * conjunction with {@link #restoreState}. + * + * Note that this will not work if the WebView is hardware accelerated. * @param b A Bundle containing the saved display data. * @param src The file where the picture data was stored. * @return True if the picture was successfully restored. @@ -4062,8 +4069,11 @@ public class WebView extends AbsoluteLayout // state. // If mNativeClass is 0, we should not reach here, so we do not // need to check it again. + boolean pressed = (mTouchMode == TOUCH_SHORTPRESS_START_MODE + || mTouchMode == TOUCH_INIT_MODE + || mTouchMode == TOUCH_SHORTPRESS_MODE); nativeRecordButtons(hasFocus() && hasWindowFocus(), - (mTouchMode == TOUCH_SHORTPRESS_START_MODE && !USE_WEBKIT_RINGS) + (pressed && !USE_WEBKIT_RINGS) || mTrackballDown || mGotCenterDown, false); drawCoreAndCursorRing(canvas, mBackgroundColor, mDrawCursorRing && drawRings); @@ -4280,7 +4290,6 @@ public class WebView extends AbsoluteLayout } nativeSetExtendSelection(); mDrawSelectionPointer = false; - mSelectionStarted = true; mTouchMode = TOUCH_DRAG_MODE; return true; } @@ -4293,6 +4302,7 @@ public class WebView extends AbsoluteLayout selectionDone(); } mOrientation = newConfig.orientation; + contentInvalidateAll(); } /** @@ -6532,6 +6542,8 @@ public class WebView extends AbsoluteLayout mLastTouchTime = eventTime; mVelocityTracker = VelocityTracker.obtain(); mSnapScrollMode = SNAP_NONE; + mPrivateHandler.sendEmptyMessageDelayed(UPDATE_SELECTION, + ViewConfiguration.getTapTimeout()); } private void startDrag() { @@ -7161,6 +7173,14 @@ public class WebView extends AbsoluteLayout } /** + * Return the overview scale of the WebView + * @return The overview scale. + */ + float getZoomOverviewScale() { + return mZoomManager.getZoomOverviewScale(); + } + + /** * @return TRUE if the WebView can be zoomed in. */ public boolean canZoomIn() { @@ -7194,10 +7214,15 @@ public class WebView extends AbsoluteLayout return mZoomManager.zoomOut(); } + /** + * This selects the best clickable target at mLastTouchX and mLastTouchY + * and calls showCursorTimed on the native side + */ private void updateSelection() { if (mNativeClass == 0) { return; } + mPrivateHandler.removeMessages(UPDATE_SELECTION); // mLastTouchX and mLastTouchY are the point in the current viewport int contentX = viewToContentX(mLastTouchX + mScrollX); int contentY = viewToContentY(mLastTouchY + mScrollY); @@ -7297,6 +7322,7 @@ public class WebView extends AbsoluteLayout return; } mTouchMode = TOUCH_DONE_MODE; + updateSelection(); switchOutDrawHistory(); // mLastTouchX and mLastTouchY are the point in the current viewport int contentX = viewToContentX(mLastTouchX + mScrollX); @@ -8187,6 +8213,14 @@ public class WebView extends AbsoluteLayout SCROLL_SELECT_TEXT, SELECT_SCROLL_INTERVAL); break; } + case UPDATE_SELECTION: { + if (mTouchMode == TOUCH_INIT_MODE + || mTouchMode == TOUCH_SHORTPRESS_MODE + || mTouchMode == TOUCH_SHORTPRESS_START_MODE) { + updateSelection(); + } + break; + } case SWITCH_TO_SHORTPRESS: { mInitialHitTestResult = null; // set by updateSelection() if (mTouchMode == TOUCH_INIT_MODE) { @@ -9249,13 +9283,13 @@ public class WebView extends AbsoluteLayout private static void checkThread() { if (Looper.myLooper() != Looper.getMainLooper()) { - RuntimeException exception = new RuntimeException( - "A WebView method was called on thread '" + + Throwable throwable = new Throwable( + "Warning: A WebView method was called on thread '" + Thread.currentThread().getName() + "'. " + "All WebView methods must be called on the UI thread. " + "Future versions of WebView may not support use on other threads."); - Log.e(LOGTAG, Log.getStackTraceString(exception)); - StrictMode.onWebViewMethodCalledOnWrongThread(exception); + Log.w(LOGTAG, Log.getStackTraceString(throwable)); + StrictMode.onWebViewMethodCalledOnWrongThread(throwable); } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 48359d4..470e843 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -2512,10 +2512,13 @@ public final class WebViewCore { // called by JNI private void restoreScale(float scale, float textWrapScale) { if (mBrowserFrame.firstLayoutDone() == false) { - final float defaultScale = mWebView.getDefaultZoomScale(); - mRestoredScale = (scale <= 0.0) ? defaultScale : scale; + // If restored scale and textWrapScale are 0, set them to + // overview and reading level scale respectively. + mRestoredScale = (scale <= 0.0) + ? mWebView.getZoomOverviewScale() : scale; if (mSettings.getUseWideViewPort()) { - mRestoredTextWrapScale = (textWrapScale <= 0.0) ? defaultScale : textWrapScale; + mRestoredTextWrapScale = (textWrapScale <= 0.0) + ? mWebView.getReadingLevelScale() : textWrapScale; } } } diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java index 7ca6aeb..7f526e7 100644 --- a/core/java/android/webkit/ZoomManager.java +++ b/core/java/android/webkit/ZoomManager.java @@ -1128,12 +1128,6 @@ class ZoomManager { mTextWrapScale = Math.max(mTextWrapScale, overviewScale); } reflowText = exceedsMinScaleIncrement(mTextWrapScale, scale); - } else { - // In case of restored scale, treat defaultScale as overview since - // it usually means the previous scale is not saved. - if (scale == mDefaultScale && settings.getLoadWithOverviewMode()) { - scale = overviewScale; - } } mInitialZoomOverview = settings.getLoadWithOverviewMode() && !exceedsMinScaleIncrement(scale, overviewScale); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index ba89ef3..7b8c7f2 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1304,16 +1304,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - // Do not append text content to scroll events they are fired frequently - // and the client has already received another event type with the text. - if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SCROLLED) { - super.dispatchPopulateAccessibilityEvent(event); - } - return false; - } - /** * Indicates whether the children's drawing cache is used during a scroll. * By default, the drawing cache is enabled but this will consume more memory. diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java index 312303d..c6e63c3 100644 --- a/core/java/android/widget/ActivityChooserView.java +++ b/core/java/android/widget/ActivityChooserView.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -23,19 +25,16 @@ import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.database.DataSetObserver; -import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.ActionProvider; import android.view.LayoutInflater; import android.view.View; -import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.ActivityChooserModel.ActivityChooserModelClient; -import com.android.internal.R; - /** * This class is a view for choosing an activity for handling a given {@link Intent}. * <p> @@ -107,6 +106,11 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod private final int mListPopupMaxWidth; /** + * The ActionProvider hosting this view, if applicable. + */ + ActionProvider mProvider; + + /** * Observer for the model data. */ private final DataSetObserver mModelDataSetOberver = new DataSetObserver() { @@ -131,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod getListPopupWindow().dismiss(); } else { getListPopupWindow().show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } } } } @@ -262,6 +269,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod } /** + * Set the provider hosting this view, if applicable. + * @hide Internal use only + */ + public void setProvider(ActionProvider provider) { + mProvider = provider; + } + + /** * Shows the popup window with activities. * * @return True if the popup was shown, false if already showing. @@ -289,9 +304,13 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod mAdapter.setMaxActivityCount(maxActivityCount); + final boolean defaultActivityButtonShown = + mDefaultActivityButton.getVisibility() == VISIBLE; + final int activityCount = mAdapter.getActivityCount(); + final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0; if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED - && activityCount > maxActivityCount + 1) { + && activityCount > maxActivityCount + maxActivityCountOffset) { mAdapter.setShowFooterView(true); } else { mAdapter.setShowFooterView(false); @@ -299,14 +318,17 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod ListPopupWindow popupWindow = getListPopupWindow(); if (!popupWindow.isShowing()) { - if (mIsSelectingDefaultActivity) { - mAdapter.setShowDefaultActivity(true); + if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) { + mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown); } else { - mAdapter.setShowDefaultActivity(false); + mAdapter.setShowDefaultActivity(false, false); } final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth); popupWindow.setContentWidth(contentWidth); popupWindow.show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } } } @@ -476,8 +498,10 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod mAdapter.getDataModel().setDefaultActivity(position); } } else { - // The first item in the model is default action => adjust index - Intent launchIntent = mAdapter.getDataModel().chooseActivity(position + 1); + // If the default target is not shown in the list, the first + // item in the model is default action => adjust index + position = mAdapter.getShowDefaultActivity() ? position : position + 1; + Intent launchIntent = mAdapter.getDataModel().chooseActivity(position); if (launchIntent != null) { mContext.startActivity(launchIntent); } @@ -523,6 +547,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod // PopUpWindow.OnDismissListener#onDismiss public void onDismiss() { notifyOnDismissListener(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(false); + } } private void notifyOnDismissListener() { @@ -553,6 +580,8 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod private boolean mShowDefaultActivity; + private boolean mHighlightDefaultActivity; + private boolean mShowFooterView; public void setDataModel(ActivityChooserModel dataModel) { @@ -640,7 +669,7 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod TextView titleView = (TextView) convertView.findViewById(R.id.title); titleView.setText(activity.loadLabel(packageManager)); // Highlight the default. - if (mShowDefaultActivity && position == 0) { + if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { convertView.setActivated(true); } else { convertView.setActivated(false); @@ -709,11 +738,18 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod return mDataModel; } - public void setShowDefaultActivity(boolean showDefaultActivity) { - if (mShowDefaultActivity != showDefaultActivity) { + public void setShowDefaultActivity(boolean showDefaultActivity, + boolean highlightDefaultActivity) { + if (mShowDefaultActivity != showDefaultActivity + || mHighlightDefaultActivity != highlightDefaultActivity) { mShowDefaultActivity = showDefaultActivity; + mHighlightDefaultActivity = highlightDefaultActivity; notifyDataSetChanged(); } } + + public boolean getShowDefaultActivity() { + return mShowDefaultActivity; + } } } diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index 72db8e8..a4b4e78 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -277,10 +277,11 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup { * called, false otherwise is returned. */ public boolean performItemClick(View view, int position, long id) { - view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); - if (mOnItemClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); + if (view != null) { + view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); + } mOnItemClickListener.onItemClick(this, view, position, id); return true; } @@ -338,8 +339,10 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup { */ public interface OnItemSelectedListener { /** - * Callback method to be invoked when an item in this view has been - * selected. + * <p>Callback method to be invoked when an item in this view has been + * selected. This callback is invoked only when the newly selected + * position is different from the previously selected position or if + * there was no selected item.</p> * * Impelmenters can call getItemAtPosition(position) if they need to access the * data associated with the selected item. @@ -878,31 +881,30 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup { @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - // This is an exceptional case which occurs when a window gets the - // focus and sends a focus event via its focused child to announce - // current focus/selection. AdapterView fires selection but not focus - // events so we change the event type here. - if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) { - event.setEventType(AccessibilityEvent.TYPE_VIEW_SELECTED); + final int eventType = event.getEventType(); + switch (eventType) { + case AccessibilityEvent.TYPE_VIEW_SCROLLED: + // Do not populate the text of scroll events. + return true; + case AccessibilityEvent.TYPE_VIEW_FOCUSED: + // This is an exceptional case which occurs when a window gets the + // focus and sends a focus event via its focused child to announce + // current focus/selection. AdapterView fires selection but not focus + // events so we change the event type here. + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) { + event.setEventType(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + break; } View selectedView = getSelectedView(); if (selectedView != null && selectedView.getVisibility() == VISIBLE) { - // We first get a chance to populate the event. - onPopulateAccessibilityEvent(event); + getSelectedView().dispatchPopulateAccessibilityEvent(event); } return false; } @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - super.onPopulateAccessibilityEvent(event); - // We send selection events only from AdapterView to avoid - // generation of such event for each child. - getSelectedView().dispatchPopulateAccessibilityEvent(event); - } - - @Override public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { if (super.onRequestSendAccessibilityEvent(child, event)) { // Add a record for ourselves as well. diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index 27610b9..07523e3 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -16,8 +16,6 @@ package android.widget; -import com.android.internal.R; - import android.content.Context; import android.content.res.TypedArray; import android.database.DataSetObserver; @@ -38,6 +36,8 @@ import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; +import com.android.internal.R; + /** * <p>An editable text view that shows completion suggestions automatically @@ -744,7 +744,6 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe if (mFilter != null) { mPopupCanBeUpdated = true; performFiltering(getText(), mLastKeyCode); - buildImeCompletions(); } } else { // drop down is automatically dismissed when enough characters @@ -837,10 +836,6 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe @Override public void onCommitCompletion(CompletionInfo completion) { if (isPopupShowing()) { - mBlockCompletion = true; - replaceText(completion.getText()); - mBlockCompletion = false; - mPopup.performItemClick(completion.getPosition()); } } @@ -938,7 +933,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe */ final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible(); - if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter()) { + final boolean enoughToFilter = enoughToFilter(); + if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter) { if (hasFocus() && hasWindowFocus() && mPopupCanBeUpdated) { showDropDown(); } @@ -1049,6 +1045,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe * <p>Displays the drop down on screen.</p> */ public void showDropDown() { + buildImeCompletions(); + if (mPopup.getAnchorView() == null) { if (mDropDownAnchorId != View.NO_ID) { mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId)); @@ -1064,7 +1062,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe mPopup.show(); mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS); } - + /** * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we @@ -1075,7 +1073,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch); } - + private void buildImeCompletions() { final ListAdapter adapter = mAdapter; if (adapter != null) { @@ -1090,8 +1088,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe realCount++; Object item = adapter.getItem(i); long id = adapter.getItemId(i); - completions[i] = new CompletionInfo(id, i, - convertSelectionToString(item)); + completions[i] = new CompletionInfo(id, i, convertSelectionToString(item)); } } diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 1b713c3..9cbe8db 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -339,10 +339,8 @@ public class CalendarView extends FrameLayout { // initialization based on locale setCurrentLocale(Locale.getDefault()); - TypedValue calendarViewStyle = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.calendarViewStyle, calendarViewStyle, true); - TypedArray attributesArray = context.obtainStyledAttributes(calendarViewStyle.resourceId, - R.styleable.CalendarView); + TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.CalendarView, + R.attr.calendarViewStyle, 0); mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber, DEFAULT_SHOW_WEEK_NUMBER); mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek, @@ -355,6 +353,9 @@ public class CalendarView extends FrameLayout { if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) { parseDate(DEFAULT_MAX_DATE, mMaxDate); } + if (mMaxDate.before(mMinDate)) { + throw new IllegalArgumentException("Max date cannot be before min date."); + } mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount, DEFAULT_SHOWN_WEEK_COUNT); mSelectedWeekBackgroundColor = attributesArray.getColor( @@ -407,9 +408,16 @@ public class CalendarView extends FrameLayout { setUpListView(); setUpAdapter(); - // go to today now + // go to today or whichever is close to today min or max date mTempDate.setTimeInMillis(System.currentTimeMillis()); - goTo(mTempDate, false, true, true); + if (mTempDate.before(mMinDate)) { + goTo(mMinDate, false, true, true); + } else if (mMaxDate.before(mTempDate)) { + goTo(mMaxDate, false, true, true); + } else { + goTo(mTempDate, false, true, true); + } + invalidate(); } diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java index 390002b..ba69288 100644 --- a/core/java/android/widget/GridLayout.java +++ b/core/java/android/widget/GridLayout.java @@ -87,19 +87,26 @@ import static java.lang.Math.min; * layout parameters. When the * {@link GridLayout#setUseDefaultMargins(boolean) useDefaultMargins} * property is set, default margins around children are automatically - * allocated based on the child's visual characteristics. Each of the - * margins so defined may be independently overridden by an assignment + * allocated based on the prevailing UI style guide for the platform. + * Each of the margins so defined may be independently overridden by an assignment * to the appropriate layout parameter. + * Default values will generally produce a reasonable spacing between components + * but values may change between different releases of the platform. * * <h4>Excess Space Distribution</h4> * + * GridLayout's distribution of excess space is based on <em>priority</em> + * rather than <em>weight</em>. + * <p> * A child's ability to stretch is inferred from the alignment properties of * its row and column groups (which are typically set by setting the * {@link LayoutParams#setGravity(int) gravity} property of the child's layout parameters). * If alignment was defined along a given axis then the component - * is taken as flexible in along that axis. If no alignment was set, - * the component is instead assumed to be inflexible. Multiple components in - * the same row or column group are considered to act in <em>parallel</em>. Such a + * is taken as <em>flexible</em> in that direction. If no alignment was set, + * the component is instead assumed to be <em>inflexible</em>. + * <p> + * Multiple components in the same row or column group are + * considered to act in <em>parallel</em>. Such a * group is flexible only if <em>all</em> of the components * within it are flexible. Row and column groups that sit either side of a common boundary * are instead considered to act in <em>series</em>. The composite group made of these two @@ -109,6 +116,23 @@ import static java.lang.Math.min; * gravity. To prevent a column from stretching, ensure that one of the components * in the column does not define a gravity. * <p> + * When the principle of flexibility does not provide complete disambiguation, + * GridLayout's algorithms favour rows and columns that are closer to its <em>right</em> + * and <em>bottom</em> edges. + * + * <h5>Limitations</h5> + * + * GridLayout does not provide support for the principle of <em>weight</em>, as defined in + * {@link LinearLayout.LayoutParams#weight}. In general, it is not therefore possible + * to configure a GridLayout to distribute excess space in non-trivial proportions between + * multiple rows or columns. + * <p> + * Some common use-cases may nevertheless be accommodated as follows. + * To place equal amounts of space around a component in a cell group; + * use {@link #CENTER} alignment (or {@link LayoutParams#setGravity(int) gravity}). + * For complete control over excess space distribution in a row or column; + * use a {@link LinearLayout} subview to hold the components in the associated cell group. + * When using either of these techniques, bear in mind that cell groups may be defined to overlap. * <p> * See {@link GridLayout.LayoutParams} for a full description of the * layout parameters used by GridLayout. @@ -180,9 +204,11 @@ public class GridLayout extends ViewGroup { // Misc constants - private static final String TAG = GridLayout.class.getName(); - private static boolean DEBUG = false; - private static final int PRF = 1; + static final String TAG = GridLayout.class.getName(); + static final boolean DEBUG = false; + static final int PRF = 1; + static final int MAX_SIZE = 100000; + static final int DEFAULT_CONTAINER_MARGIN = 0; // Defaults @@ -191,8 +217,6 @@ public class GridLayout extends ViewGroup { private static final boolean DEFAULT_USE_DEFAULT_MARGINS = false; private static final boolean DEFAULT_ORDER_PRESERVED = true; private static final int DEFAULT_ALIGNMENT_MODE = ALIGN_MARGINS; - private static final int DEFAULT_CONTAINER_MARGIN = 0; - private static final int MAX_SIZE = 100000; // TypedArray indices @@ -206,13 +230,13 @@ public class GridLayout extends ViewGroup { // Instance variables - private final Axis mHorizontalAxis = new Axis(true); - private final Axis mVerticalAxis = new Axis(false); - private boolean mLayoutParamsValid = false; - private int mOrientation = DEFAULT_ORIENTATION; - private boolean mUseDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS; - private int mAlignmentMode = DEFAULT_ALIGNMENT_MODE; - private int mDefaultGap; + final Axis horizontalAxis = new Axis(true); + final Axis verticalAxis = new Axis(false); + boolean layoutParamsValid = false; + int orientation = DEFAULT_ORIENTATION; + boolean useDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS; + int alignmentMode = DEFAULT_ALIGNMENT_MODE; + int defaultGap; // Constructors @@ -224,7 +248,7 @@ public class GridLayout extends ViewGroup { if (DEBUG) { setWillNotDraw(false); } - mDefaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap); + defaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridLayout); try { setRowCount(a.getInt(ROW_COUNT, DEFAULT_COUNT)); @@ -266,13 +290,12 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_orientation */ public int getOrientation() { - return mOrientation; + return orientation; } /** - * The orientation property does not affect layout. Orientation is used - * only to generate default row/column indices when they are not specified - * by a component's layout parameters. + * Orientation is used only to generate default row/column indices when + * they are not specified by a component's layout parameters. * <p> * The default value of this property is {@link #HORIZONTAL}. * @@ -283,8 +306,9 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_orientation */ public void setOrientation(int orientation) { - if (mOrientation != orientation) { - mOrientation = orientation; + if (this.orientation != orientation) { + this.orientation = orientation; + invalidateStructure(); requestLayout(); } } @@ -302,13 +326,12 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_rowCount */ public int getRowCount() { - return mVerticalAxis.getCount(); + return verticalAxis.getCount(); } /** - * The rowCount property does not affect layout. RowCount is used - * only to generate default row/column indices when they are not specified - * by a component's layout parameters. + * RowCount is used only to generate default row/column indices when + * they are not specified by a component's layout parameters. * * @param rowCount the number of rows * @@ -318,7 +341,9 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_rowCount */ public void setRowCount(int rowCount) { - mVerticalAxis.setCount(rowCount); + verticalAxis.setCount(rowCount); + invalidateStructure(); + requestLayout(); } /** @@ -334,13 +359,12 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_columnCount */ public int getColumnCount() { - return mHorizontalAxis.getCount(); + return horizontalAxis.getCount(); } /** - * The columnCount property does not affect layout. ColumnCount is used - * only to generate default column/column indices when they are not specified - * by a component's layout parameters. + * ColumnCount is used only to generate default column/column indices when + * they are not specified by a component's layout parameters. * * @param columnCount the number of columns. * @@ -350,7 +374,9 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_columnCount */ public void setColumnCount(int columnCount) { - mHorizontalAxis.setCount(columnCount); + horizontalAxis.setCount(columnCount); + invalidateStructure(); + requestLayout(); } /** @@ -364,7 +390,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_useDefaultMargins */ public boolean getUseDefaultMargins() { - return mUseDefaultMargins; + return useDefaultMargins; } /** @@ -394,7 +420,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_useDefaultMargins */ public void setUseDefaultMargins(boolean useDefaultMargins) { - mUseDefaultMargins = useDefaultMargins; + this.useDefaultMargins = useDefaultMargins; requestLayout(); } @@ -411,7 +437,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_alignmentMode */ public int getAlignmentMode() { - return mAlignmentMode; + return alignmentMode; } /** @@ -430,7 +456,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_alignmentMode */ public void setAlignmentMode(int alignmentMode) { - mAlignmentMode = alignmentMode; + this.alignmentMode = alignmentMode; requestLayout(); } @@ -445,7 +471,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_rowOrderPreserved */ public boolean isRowOrderPreserved() { - return mVerticalAxis.isOrderPreserved(); + return verticalAxis.isOrderPreserved(); } /** @@ -465,7 +491,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_rowOrderPreserved */ public void setRowOrderPreserved(boolean rowOrderPreserved) { - mVerticalAxis.setOrderPreserved(rowOrderPreserved); + verticalAxis.setOrderPreserved(rowOrderPreserved); invalidateStructure(); requestLayout(); } @@ -481,7 +507,7 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_columnOrderPreserved */ public boolean isColumnOrderPreserved() { - return mHorizontalAxis.isOrderPreserved(); + return horizontalAxis.isOrderPreserved(); } /** @@ -501,14 +527,14 @@ public class GridLayout extends ViewGroup { * @attr ref android.R.styleable#GridLayout_columnOrderPreserved */ public void setColumnOrderPreserved(boolean columnOrderPreserved) { - mHorizontalAxis.setOrderPreserved(columnOrderPreserved); + horizontalAxis.setOrderPreserved(columnOrderPreserved); invalidateStructure(); requestLayout(); } // Static utility methods - private static int max2(int[] a, int valueIfEmpty) { + static int max2(int[] a, int valueIfEmpty) { int result = valueIfEmpty; for (int i = 0, N = a.length; i < N; i++) { result = Math.max(result, a[i]); @@ -517,14 +543,14 @@ public class GridLayout extends ViewGroup { } @SuppressWarnings("unchecked") - private static <T> T[] append(T[] a, T[] b) { + static <T> T[] append(T[] a, T[] b) { T[] result = (T[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length); System.arraycopy(a, 0, result, 0, a.length); System.arraycopy(b, 0, result, a.length, b.length); return result; } - private static Alignment getAlignment(int gravity, boolean horizontal) { + static Alignment getAlignment(int gravity, boolean horizontal) { int mask = horizontal ? HORIZONTAL_GRAVITY_MASK : VERTICAL_GRAVITY_MASK; int shift = horizontal ? AXIS_X_SHIFT : AXIS_Y_SHIFT; int flags = (gravity & mask) >> shift; @@ -547,7 +573,7 @@ public class GridLayout extends ViewGroup { if (c.getClass() == Space.class) { return 0; } - return mDefaultGap / 2; + return defaultGap / 2; } private int getDefaultMargin(View c, boolean isAtEdge, boolean horizontal, boolean leading) { @@ -555,18 +581,18 @@ public class GridLayout extends ViewGroup { } private int getDefaultMarginValue(View c, LayoutParams p, boolean horizontal, boolean leading) { - if (!mUseDefaultMargins) { + if (!useDefaultMargins) { return 0; } Spec spec = horizontal ? p.columnSpec : p.rowSpec; - Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis; + Axis axis = horizontal ? horizontalAxis : verticalAxis; Interval span = spec.span; boolean isAtEdge = leading ? (span.min == 0) : (span.max == axis.getCount()); return getDefaultMargin(c, isAtEdge, horizontal, leading); } - private int getMargin1(View view, boolean horizontal, boolean leading) { + int getMargin1(View view, boolean horizontal, boolean leading) { LayoutParams lp = getLayoutParams(view); int margin = horizontal ? (leading ? lp.leftMargin : lp.rightMargin) : @@ -575,10 +601,10 @@ public class GridLayout extends ViewGroup { } private int getMargin(View view, boolean horizontal, boolean leading) { - if (mAlignmentMode == ALIGN_MARGINS) { + if (alignmentMode == ALIGN_MARGINS) { return getMargin1(view, horizontal, leading); } else { - Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis; + Axis axis = horizontal ? horizontalAxis : verticalAxis; int[] margins = leading ? axis.getLeadingMargins() : axis.getTrailingMargins(); LayoutParams lp = getLayoutParams(view); Spec spec = horizontal ? lp.columnSpec : lp.rowSpec; @@ -591,10 +617,6 @@ public class GridLayout extends ViewGroup { return getMargin(child, horizontal, true) + getMargin(child, horizontal, false); } - private static int valueIfDefined(int value, int defaultValue) { - return (value != UNDEFINED) ? value : defaultValue; - } - private static boolean fits(int[] a, int value, int start, int end) { if (end > a.length) { return false; @@ -629,9 +651,9 @@ public class GridLayout extends ViewGroup { // install default indices for cells that don't define them private void validateLayoutParams() { - final boolean horizontal = (mOrientation == HORIZONTAL); - final int axisCount = horizontal ? mHorizontalAxis.count : mVerticalAxis.count; - final int count = valueIfDefined(axisCount, 0); + final boolean horizontal = (orientation == HORIZONTAL); + final Axis axis = horizontal ? horizontalAxis : verticalAxis; + final int count = (axis.definedCount != UNDEFINED) ? axis.definedCount : 0; int major = 0; int minor = 0; @@ -640,15 +662,17 @@ public class GridLayout extends ViewGroup { for (int i = 0, N = getChildCount(); i < N; i++) { LayoutParams lp = getLayoutParams1(getChildAt(i)); - final Interval majorRange = (horizontal ? lp.rowSpec : lp.columnSpec).span; - final boolean majorWasDefined = (majorRange.min != UNDEFINED); + final Spec majorSpec = horizontal ? lp.rowSpec : lp.columnSpec; + final Interval majorRange = majorSpec.span; + final boolean majorWasDefined = majorSpec.startDefined; final int majorSpan = majorRange.size(); if (majorWasDefined) { major = majorRange.min; } - final Interval minorRange = (horizontal ? lp.columnSpec : lp.rowSpec).span; - final boolean minorWasDefined = (minorRange.min != UNDEFINED); + final Spec minorSpec = horizontal ? lp.columnSpec : lp.rowSpec; + final Interval minorRange = minorSpec.span; + final boolean minorWasDefined = minorSpec.startDefined; final int minorSpan = clip(minorRange, minorWasDefined, count); if (minorWasDefined) { minor = minorRange.min; @@ -685,9 +709,9 @@ public class GridLayout extends ViewGroup { } private void invalidateStructure() { - mLayoutParamsValid = false; - mHorizontalAxis.invalidateStructure(); - mVerticalAxis.invalidateStructure(); + layoutParamsValid = false; + horizontalAxis.invalidateStructure(); + verticalAxis.invalidateStructure(); // This can end up being done twice. Better twice than not at all. invalidateValues(); } @@ -695,9 +719,9 @@ public class GridLayout extends ViewGroup { private void invalidateValues() { // Need null check because requestLayout() is called in View's initializer, // before we are set up. - if (mHorizontalAxis != null && mVerticalAxis != null) { - mHorizontalAxis.invalidateValues(); - mVerticalAxis.invalidateValues(); + if (horizontalAxis != null && verticalAxis != null) { + horizontalAxis.invalidateValues(); + verticalAxis.invalidateValues(); } } @@ -705,10 +729,10 @@ public class GridLayout extends ViewGroup { return (LayoutParams) c.getLayoutParams(); } - private LayoutParams getLayoutParams(View c) { - if (!mLayoutParamsValid) { + final LayoutParams getLayoutParams(View c) { + if (!layoutParamsValid) { validateLayoutParams(); - mLayoutParamsValid = true; + layoutParamsValid = true; } return getLayoutParams1(c); } @@ -752,7 +776,7 @@ public class GridLayout extends ViewGroup { paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.argb(50, 255, 255, 255)); - int[] xs = mHorizontalAxis.locations; + int[] xs = horizontalAxis.locations; if (xs != null) { for (int i = 0, length = xs.length; i < length; i++) { int x = xs[i]; @@ -760,7 +784,7 @@ public class GridLayout extends ViewGroup { } } - int[] ys = mVerticalAxis.locations; + int[] ys = verticalAxis.locations; if (ys != null) { for (int i = 0, length = ys.length; i < length; i++) { int y = ys[i]; @@ -822,7 +846,7 @@ public class GridLayout extends ViewGroup { // Measurement - private boolean isGone(View c) { + final boolean isGone(View c) { return c.getVisibility() == View.GONE; } @@ -847,8 +871,8 @@ public class GridLayout extends ViewGroup { protected void onMeasure(int widthSpec, int heightSpec) { measureChildrenWithMargins(widthSpec, heightSpec); - int width = getPaddingLeft() + mHorizontalAxis.getMeasure(widthSpec) + getPaddingRight(); - int height = getPaddingTop() + mVerticalAxis.getMeasure(heightSpec) + getPaddingBottom(); + int width = getPaddingLeft() + horizontalAxis.getMeasure(widthSpec) + getPaddingRight(); + int height = getPaddingTop() + verticalAxis.getMeasure(heightSpec) + getPaddingBottom(); int measuredWidth = Math.max(width, getSuggestedMinimumWidth()); int measuredHeight = Math.max(height, getSuggestedMinimumHeight()); @@ -866,7 +890,7 @@ public class GridLayout extends ViewGroup { return horizontal ? c.getMeasuredWidth() : c.getMeasuredHeight(); } - private int getMeasurementIncludingMargin(View c, boolean horizontal) { + final int getMeasurementIncludingMargin(View c, boolean horizontal) { if (isGone(c)) { return 0; } @@ -879,7 +903,7 @@ public class GridLayout extends ViewGroup { invalidateValues(); } - private Alignment getAlignment(Alignment alignment, boolean horizontal) { + final Alignment getAlignment(Alignment alignment, boolean horizontal) { return (alignment != UNDEFINED_ALIGNMENT) ? alignment : (horizontal ? LEFT : BASELINE); } @@ -908,11 +932,11 @@ public class GridLayout extends ViewGroup { int paddingRight = getPaddingRight(); int paddingBottom = getPaddingBottom(); - mHorizontalAxis.layout(targetWidth - paddingLeft - paddingRight); - mVerticalAxis.layout(targetHeight - paddingTop - paddingBottom); + horizontalAxis.layout(targetWidth - paddingLeft - paddingRight); + verticalAxis.layout(targetHeight - paddingTop - paddingBottom); - int[] hLocations = mHorizontalAxis.getLocations(); - int[] vLocations = mVerticalAxis.getLocations(); + int[] hLocations = horizontalAxis.getLocations(); + int[] vLocations = verticalAxis.getLocations(); for (int i = 0, N = getChildCount(); i < N; i++) { View c = getChildAt(i); @@ -941,8 +965,8 @@ public class GridLayout extends ViewGroup { int dx, dy; - Bounds colBounds = mHorizontalAxis.getGroupBounds().getValue(i); - Bounds rowBounds = mVerticalAxis.getGroupBounds().getValue(i); + Bounds colBounds = horizontalAxis.getGroupBounds().getValue(i); + Bounds rowBounds = verticalAxis.getGroupBounds().getValue(i); // Gravity offsets: the location of the alignment group relative to its cell group. //noinspection NullableProblems @@ -990,7 +1014,7 @@ public class GridLayout extends ViewGroup { distinguished by the "horizontal" flag which is true for the horizontal axis and false for the vertical one. */ - private class Axis { + final class Axis { private static final int MIN_VALUE = -1000000; private static final int NEW = 0; @@ -999,9 +1023,8 @@ public class GridLayout extends ViewGroup { public final boolean horizontal; - public int count = UNDEFINED; - public boolean countValid = false; - public boolean countWasExplicitySet = false; + public int definedCount = UNDEFINED; + private int inferredCount = UNDEFINED; PackedMap<Spec, Bounds> groupBounds; public boolean groupBoundsValid = false; @@ -1024,7 +1047,7 @@ public class GridLayout extends ViewGroup { public int[] locations; public boolean locationsValid = false; - private boolean mOrderPreserved = DEFAULT_ORDER_PRESERVED; + boolean orderPreserved = DEFAULT_ORDER_PRESERVED; private MutableInt parentMin = new MutableInt(0); private MutableInt parentMax = new MutableInt(-MAX_SIZE); @@ -1046,25 +1069,27 @@ public class GridLayout extends ViewGroup { return count == -1 ? UNDEFINED : count; } - public int getCount() { - if (!countValid) { - count = max(0, maxIndex()); // if there are no cells, the count is zero - countValid = true; + private int getInferredCount() { + if (inferredCount == UNDEFINED) { + inferredCount = max(0, maxIndex()); // if there are no cells, actual count is zero } - return count; + return inferredCount; + } + + public int getCount() { + return max(definedCount, getInferredCount()); } public void setCount(int count) { - this.count = count; - this.countWasExplicitySet = count != UNDEFINED; + this.definedCount = count; } public boolean isOrderPreserved() { - return mOrderPreserved; + return orderPreserved; } public void setOrderPreserved(boolean orderPreserved) { - mOrderPreserved = orderPreserved; + this.orderPreserved = orderPreserved; invalidateStructure(); } @@ -1093,7 +1118,7 @@ public class GridLayout extends ViewGroup { } } - private PackedMap<Spec, Bounds> getGroupBounds() { + public PackedMap<Spec, Bounds> getGroupBounds() { if (groupBounds == null) { groupBounds = createGroupBounds(); } @@ -1183,7 +1208,7 @@ public class GridLayout extends ViewGroup { // Group arcs by their first vertex, returning an array of arrays. // This is linear in the number of arcs. - private Arc[][] groupArcsByFirstVertex(Arc[] arcs) { + Arc[][] groupArcsByFirstVertex(Arc[] arcs) { int N = getCount() + 1; // the number of vertices Arc[][] result = new Arc[N][]; int[] sizes = new int[N]; @@ -1262,7 +1287,7 @@ public class GridLayout extends ViewGroup { addComponentSizes(maxs, getBackwardLinks()); // Add ordering constraints to prevent row/col sizes from going negative - if (mOrderPreserved) { + if (orderPreserved) { // Add a constraint for every row/col for (int i = 0; i < getCount(); i++) { include(mins, new Interval(i, i + 1), new MutableInt(0)); @@ -1315,6 +1340,48 @@ public class GridLayout extends ViewGroup { return false; } + private void init(int[] locations) { + Arrays.fill(locations, MIN_VALUE); + locations[0] = 0; + } + + private String arcsToString(List<Arc> arcs) { + String var = horizontal ? "c" : "r"; + StringBuilder result = new StringBuilder(); + boolean first = false; + for(Arc arc : arcs) { + if (!first) { + first = true; + } else { + result =result.append(", "); + } + int src = arc.span.min; + int dst = arc.span.max; + int value = arc.value.value; + result.append((src < dst) ? + var + dst + " - " + var + src + " > " + value : + var + src + " - " + var + dst + " < " + -value); + + } + return result.toString(); + } + + private void logError(String axisName, Arc[] arcs, boolean[] culprits0) { + List<Arc> culprits = new ArrayList<Arc>(); + List<Arc> removed = new ArrayList<Arc>(); + for (int c = 0; c < arcs.length; c++) { + Arc arc = arcs[c]; + if (culprits0[c]) { + culprits.add(arc); + } + if (!arc.valid) { + removed.add(arc); + } + } + Log.d(TAG, axisName + " constraints: " + arcsToString(culprits) + " are inconsistent; " + + "permanently removing: " + arcsToString(removed) + ". "); + } + /* Bellman-Ford variant - modified to reduce typical running time from O(N^2) to O(N) @@ -1350,51 +1417,54 @@ public class GridLayout extends ViewGroup { completes in O(N) steps with very low constants. */ private void solve(Arc[] arcs, int[] locations) { - String axis = horizontal ? "horizontal" : "vertical"; + String axisName = horizontal ? "horizontal" : "vertical"; int N = getCount() + 1; // The number of vertices is the number of columns/rows + 1. + boolean[] originalCulprits = null; - // We take one extra pass over traditional Bellman-Ford (and omit their final step) - for (int i = 0; i < N; i++) { - boolean changed = false; - for (int j = 0, length = arcs.length; j < length; j++) { - changed |= relax(locations, arcs[j]); - } - if (!changed) { - if (DEBUG) { - Log.v(TAG, axis + " iteration completed in " + (1 + i) + " steps of " + N); + for (int p = 0; p < arcs.length; p++) { + init(locations); + + // We take one extra pass over traditional Bellman-Ford (and omit their final step) + for (int i = 0; i < N; i++) { + boolean changed = false; + for (int j = 0, length = arcs.length; j < length; j++) { + changed |= relax(locations, arcs[j]); + } + if (!changed) { + if (originalCulprits != null) { + logError(axisName, arcs, originalCulprits); + } + if (DEBUG) { + Log.v(TAG, axisName + " iteration completed in " + + (1 + i) + " steps of " + N); + } + return; } - return; } - } - Log.d(TAG, "The " + axis + " constraints contained a contradiction. Resolving... "); - Log.d(TAG, Arrays.toString(arcs)); + boolean[] culprits = new boolean[arcs.length]; + for (int i = 0; i < N; i++) { + for (int j = 0, length = arcs.length; j < length; j++) { + culprits[j] |= relax(locations, arcs[j]); + } + } - boolean[] culprits = new boolean[arcs.length]; - for (int i = 0; i < N; i++) { - for (int j = 0, length = arcs.length; j < length; j++) { - culprits[j] |= relax(locations, arcs[j]); + if (p == 0) { + originalCulprits = culprits; } - } - for (int i = 0; i < culprits.length; i++) { - if (culprits[i]) { - Arc arc = arcs[i]; - // Only remove max values, min values alone cannot be inconsistent - if (arc.span.min < arc.span.max) { - continue; + + for (int i = 0; i < arcs.length; i++) { + if (culprits[i]) { + Arc arc = arcs[i]; + // Only remove max values, min values alone cannot be inconsistent + if (arc.span.min < arc.span.max) { + continue; + } + arc.valid = false; + break; } - Log.d(TAG, "Removing: " + arc); - arc.valid = false; - break; } } - solve1(arcs, locations); - } - - private void solve1(Arc[] arcs, int[] a) { - Arrays.fill(a, MIN_VALUE); - a[0] = 0; - solve(arcs, a); } private void computeMargins(boolean leading) { @@ -1410,7 +1480,9 @@ public class GridLayout extends ViewGroup { } } - private int[] getLeadingMargins() { + // External entry points + + public int[] getLeadingMargins() { if (leadingMargins == null) { leadingMargins = new int[getCount() + 1]; } @@ -1421,7 +1493,7 @@ public class GridLayout extends ViewGroup { return leadingMargins; } - private int[] getTrailingMargins() { + public int[] getTrailingMargins() { if (trailingMargins == null) { trailingMargins = new int[getCount() + 1]; } @@ -1433,10 +1505,10 @@ public class GridLayout extends ViewGroup { } private void computeLocations(int[] a) { - solve1(getArcs(), a); + solve(getArcs(), a); } - private int[] getLocations() { + public int[] getLocations() { if (locations == null) { int N = getCount() + 1; locations = new int[N]; @@ -1448,8 +1520,6 @@ public class GridLayout extends ViewGroup { return locations; } - // External entry points - private int size(int[] locations) { return max2(locations, 0) - locations[0]; } @@ -1465,7 +1535,7 @@ public class GridLayout extends ViewGroup { return size(getLocations()); } - private int getMeasure(int measureSpec) { + public int getMeasure(int measureSpec) { int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); switch (mode) { @@ -1485,13 +1555,13 @@ public class GridLayout extends ViewGroup { } } - private void layout(int size) { + public void layout(int size) { setParentConstraints(size, size); getLocations(); } - private void invalidateStructure() { - countValid = false; + public void invalidateStructure() { + inferredCount = UNDEFINED; groupBounds = null; forwardLinks = null; @@ -1506,7 +1576,7 @@ public class GridLayout extends ViewGroup { invalidateValues(); } - private void invalidateValues() { + public void invalidateValues() { groupBoundsValid = false; forwardLinksValid = false; backwardLinksValid = false; @@ -1536,9 +1606,22 @@ public class GridLayout extends ViewGroup { * both aspects of alignment within the cell group. It is also possible to specify a child's * alignment within its cell group by using the {@link GridLayout.LayoutParams#setGravity(int)} * method. - * <p> - * See {@link GridLayout} for a description of the conventions used by GridLayout - * in reference to grid indices. + * + * <h4>WRAP_CONTENT and MATCH_PARENT</h4> + * + * Because the default values of the {@link #width} and {@link #height} + * properties are both {@link #WRAP_CONTENT}, this value never needs to be explicitly + * declared in the layout parameters of GridLayout's children. In addition, + * GridLayout does not distinguish the special size value {@link #MATCH_PARENT} from + * {@link #WRAP_CONTENT}. A component's ability to expand to the size of the parent is + * instead controlled by the principle of <em>flexibility</em>, + * as discussed in {@link GridLayout}. + * + * <h4>Summary</h4> + * + * You should not need to use either of the special size values: + * {@code WRAP_CONTENT} or {@code MATCH_PARENT} when configuring the children of + * a GridLayout. * * <h4>Default values</h4> * @@ -1561,12 +1644,17 @@ public class GridLayout extends ViewGroup { * {@link GridLayout#setUseDefaultMargins(boolean) useDefaultMargins} is * {@code false}; otherwise {@link #UNDEFINED}, to * indicate that a default value should be computed on demand. </li> - * <li>{@link #rowSpec}{@code .span} = {@code [0, 1]} </li> - * <li>{@link #rowSpec}{@code .alignment} = {@link #BASELINE} </li> - * <li>{@link #columnSpec}{@code .span} = {@code [0, 1]} </li> - * <li>{@link #columnSpec}{@code .alignment} = {@link #LEFT} </li> + * <li>{@link #rowSpec}<code>.row</code> = {@link #UNDEFINED} </li> + * <li>{@link #rowSpec}<code>.rowSpan</code> = 1 </li> + * <li>{@link #rowSpec}<code>.alignment</code> = {@link #BASELINE} </li> + * <li>{@link #columnSpec}<code>.column</code> = {@link #UNDEFINED} </li> + * <li>{@link #columnSpec}<code>.columnSpan</code> = 1 </li> + * <li>{@link #columnSpec}<code>.alignment</code> = {@link #LEFT} </li> * </ul> * + * See {@link GridLayout} for a more complete description of the conventions + * used by GridLayout in the interpretation of the properties of this class. + * * @attr ref android.R.styleable#GridLayout_Layout_layout_row * @attr ref android.R.styleable#GridLayout_Layout_layout_rowSpan * @attr ref android.R.styleable#GridLayout_Layout_layout_column @@ -1606,15 +1694,16 @@ public class GridLayout extends ViewGroup { // Instance variables /** - * The spec that specifies the vertical characteristics of the cell group + * The spec that defines the vertical characteristics of the cell group * described by these layout parameters. */ - public Spec rowSpec; + public Spec rowSpec = Spec.UNDEFINED; + /** - * The spec that specifies the horizontal characteristics of the cell group + * The spec that defines the horizontal characteristics of the cell group * described by these layout parameters. */ - public Spec columnSpec; + public Spec columnSpec = Spec.UNDEFINED; // Constructors @@ -1646,7 +1735,7 @@ public class GridLayout extends ViewGroup { * Constructs a new LayoutParams with default values as defined in {@link LayoutParams}. */ public LayoutParams() { - this(spec(UNDEFINED), spec(UNDEFINED)); + this(Spec.UNDEFINED, Spec.UNDEFINED); } // Copying constructors @@ -1670,8 +1759,8 @@ public class GridLayout extends ViewGroup { */ public LayoutParams(LayoutParams that) { super(that); - this.rowSpec = new Spec(that.rowSpec); - this.columnSpec = new Spec(that.columnSpec); + this.rowSpec = that.rowSpec; + this.columnSpec = that.columnSpec; } // AttributeSet constructors @@ -1750,11 +1839,11 @@ public class GridLayout extends ViewGroup { this.height = attributes.getLayoutDimension(heightAttr, DEFAULT_HEIGHT); } - private void setRowSpecSpan(Interval span) { + final void setRowSpecSpan(Interval span) { rowSpec = rowSpec.copyWriteSpan(span); } - private void setColumnSpecSpan(Interval span) { + final void setColumnSpecSpan(Interval span) { columnSpec = columnSpec.copyWriteSpan(span); } } @@ -1763,7 +1852,7 @@ public class GridLayout extends ViewGroup { In place of a HashMap from span to Int, use an array of key/value pairs - stored in Arcs. Add the mutables completesCycle flag to avoid creating another hash table for detecting cycles. */ - private static class Arc { + final static class Arc { public final Interval span; public final MutableInt value; public boolean valid = true; @@ -1781,18 +1870,18 @@ public class GridLayout extends ViewGroup { // A mutable Integer - used to avoid heap allocation during the layout operation - private static class MutableInt { + final static class MutableInt { public int value; - private MutableInt() { + public MutableInt() { reset(); } - private MutableInt(int value) { + public MutableInt(int value) { this.value = value; } - private void reset() { + public void reset() { value = Integer.MIN_VALUE; } @@ -1802,7 +1891,7 @@ public class GridLayout extends ViewGroup { } } - private static class Assoc<K, V> extends ArrayList<Pair<K, V>> { + final static class Assoc<K, V> extends ArrayList<Pair<K, V>> { private final Class<K> keyType; private final Class<V> valueType; @@ -1811,7 +1900,7 @@ public class GridLayout extends ViewGroup { this.valueType = valueType; } - private static <K, V> Assoc<K, V> of(Class<K> keyType, Class<V> valueType) { + public static <K, V> Assoc<K, V> of(Class<K> keyType, Class<V> valueType) { return new Assoc<K, V>(keyType, valueType); } @@ -1847,7 +1936,7 @@ public class GridLayout extends ViewGroup { rather than using (and storing) an implementation of Map<Key, ?>. */ @SuppressWarnings(value = "unchecked") - private static class PackedMap<K, V> { + final static class PackedMap<K, V> { public final int[] index; public final K[] keys; public final V[] values; @@ -1859,7 +1948,7 @@ public class GridLayout extends ViewGroup { this.values = compact(values, index); } - private V getValue(int i) { + public V getValue(int i) { return values[index[i]]; } @@ -1907,7 +1996,7 @@ public class GridLayout extends ViewGroup { group to Bounds and to loop through all Views in the group taking the maximum of the values for each View. */ - private static class Bounds { + static class Bounds { public int before; public int after; public int flexibility; // we're flexible iff all included specs are flexible @@ -1969,7 +2058,7 @@ public class GridLayout extends ViewGroup { * Intervals are often written as {@code [min, max]} and represent the set of values * {@code x} such that {@code min <= x < max}. */ - static class Interval { + final static class Interval { /** * The minimum value. */ @@ -1995,11 +2084,11 @@ public class GridLayout extends ViewGroup { this.max = max; } - private int size() { + int size() { return max - min; } - private Interval inverse() { + Interval inverse() { return new Interval(max, min); } @@ -2062,32 +2151,31 @@ public class GridLayout extends ViewGroup { * For column groups, this specifies the horizontal alignment. */ public static class Spec { + static final Spec UNDEFINED = spec(GridLayout.UNDEFINED); + + final boolean startDefined; final Interval span; final Alignment alignment; - private Spec(Interval span, Alignment alignment) { + private Spec(boolean startDefined, Interval span, Alignment alignment) { + this.startDefined = startDefined; this.span = span; this.alignment = alignment; } - /* Copying constructor */ - private Spec(Spec that) { - this(that.span, that.alignment); - } - - private Spec(int start, int size, Alignment alignment) { - this(new Interval(start, start + size), alignment); + private Spec(boolean startDefined, int start, int size, Alignment alignment) { + this(startDefined, new Interval(start, start + size), alignment); } - private Spec copyWriteSpan(Interval span) { - return new Spec(span, alignment); + final Spec copyWriteSpan(Interval span) { + return new Spec(startDefined, span, alignment); } - private Spec copyWriteAlignment(Alignment alignment) { - return new Spec(span, alignment); + final Spec copyWriteAlignment(Alignment alignment) { + return new Spec(startDefined, span, alignment); } - int getFlexibility() { + final int getFlexibility() { return (alignment == UNDEFINED_ALIGNMENT) ? INFLEXIBLE : CAN_STRETCH; } @@ -2143,7 +2231,7 @@ public class GridLayout extends ViewGroup { * @param alignment the alignment */ public static Spec spec(int start, int size, Alignment alignment) { - return new Spec(start, size, alignment); + return new Spec(start != UNDEFINED, start, size, alignment); } /** @@ -2246,7 +2334,7 @@ public class GridLayout extends ViewGroup { } } - private static final Alignment UNDEFINED_ALIGNMENT = new Alignment() { + static final Alignment UNDEFINED_ALIGNMENT = new Alignment() { public int getAlignmentValue(View view, int viewSize) { return UNDEFINED; } @@ -2367,7 +2455,7 @@ public class GridLayout extends ViewGroup { } }; - private static boolean canStretch(int flexibility) { + static boolean canStretch(int flexibility) { return (flexibility & CAN_STRETCH) != 0; } diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java index 690164c..a63b8c8 100644 --- a/core/java/android/widget/MediaController.java +++ b/core/java/android/widget/MediaController.java @@ -299,6 +299,7 @@ public class MediaController extends FrameLayout { p.format = PixelFormat.TRANSLUCENT; p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; p.token = null; p.windowAnimations = 0; // android.R.style.DropDownAnimationDown; diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java index e571998..6aee5a0 100644 --- a/core/java/android/widget/OverScroller.java +++ b/core/java/android/widget/OverScroller.java @@ -584,10 +584,10 @@ public class OverScroller { // A device specific coefficient adjusted to physical values. private static float PHYSICAL_COEF; - private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math.log(0.9)); - private static final float INFLEXION = 0.4f; // Tension lines cross at (INFLEXION, 1) - private static final float START_TENSION = 1.0f; - private static final float END_TENSION = 0.6666f; + private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9)); + private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1) + private static final float START_TENSION = 0.5f; + private static final float END_TENSION = 1.0f; private static final float P1 = START_TENSION * INFLEXION; private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION); diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java index 17512d8..6a6d767 100644 --- a/core/java/android/widget/PopupMenu.java +++ b/core/java/android/widget/PopupMenu.java @@ -157,6 +157,8 @@ public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback { * @hide */ public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + if (!subMenu.hasVisibleItems()) { return true; } diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 4d45c2f..aac20c4 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -796,6 +796,21 @@ public class PopupWindow { * @param y the popup's y location offset */ public void showAtLocation(View parent, int gravity, int x, int y) { + showAtLocation(parent.getWindowToken(), gravity, x, y); + } + + /** + * Display the content view in a popup window at the specified location. + * + * @param token Window token to use for creating the new window + * @param gravity the gravity which controls the placement of the popup window + * @param x the popup's x location offset + * @param y the popup's y location offset + * + * @hide Internal use only. Applications should use + * {@link #showAtLocation(View, int, int, int)} instead. + */ + public void showAtLocation(IBinder token, int gravity, int x, int y) { if (isShowing() || mContentView == null) { return; } @@ -805,7 +820,7 @@ public class PopupWindow { mIsShowing = true; mIsDropdown = false; - WindowManager.LayoutParams p = createPopupLayout(parent.getWindowToken()); + WindowManager.LayoutParams p = createPopupLayout(token); p.windowAnimations = computeAnimationResource(); preparePopup(p); diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 6edfd59..12a93ac 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -212,6 +212,11 @@ public class RelativeLayout extends ViewGroup { * Describes how the child views are positioned. Defaults to * <code>Gravity.LEFT | Gravity.TOP</code>. * + * <p>Note that since RelativeLayout considers the positioning of each child + * relative to one another to be significant, setting gravity will affect + * the positioning of all children as a single unit within the parent. + * This happens after children have been relatively positioned.</p> + * * @param gravity See {@link android.view.Gravity} * * @see #setHorizontalGravity(int) diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index f230031..adf2b7b 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -120,6 +120,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { private CharSequence mOldQueryText; private CharSequence mUserQuery; private boolean mExpandedInActionView; + private int mCollapsedImeOptions; private SearchableInfo mSearchable; private Bundle mAppSearchData; @@ -1166,6 +1167,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { clearFocus(); updateViewsVisibility(true); mQueryTextView.setText(""); + mQueryTextView.setImeOptions(mCollapsedImeOptions); mExpandedInActionView = false; } @@ -1175,6 +1177,8 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { @Override public void onActionViewExpanded() { mExpandedInActionView = true; + mCollapsedImeOptions = mQueryTextView.getImeOptions(); + mQueryTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN); setIconified(false); } diff --git a/core/java/android/widget/ShareActionProvider.java b/core/java/android/widget/ShareActionProvider.java index 6e29024..3627890 100644 --- a/core/java/android/widget/ShareActionProvider.java +++ b/core/java/android/widget/ShareActionProvider.java @@ -169,6 +169,7 @@ public class ShareActionProvider extends ActionProvider { mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId); activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); + activityChooserView.setProvider(this); return activityChooserView; } diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java index 14cbf6f..6b2f3e4 100644 --- a/core/java/android/widget/SpellChecker.java +++ b/core/java/android/widget/SpellChecker.java @@ -75,6 +75,20 @@ public class SpellChecker implements SpellCheckerSessionListener { mLength = 0; } + /** + * @return true if a spell checker session has successfully been created. Returns false if not, + * for instance when spell checking has been disabled in settings. + */ + public boolean isSessionActive() { + return mSpellCheckerSession != null; + } + + public void closeSession() { + if (mSpellCheckerSession != null) { + mSpellCheckerSession.close(); + } + } + public void addSpellCheckSpan(SpellCheckSpan spellCheckSpan) { int length = mIds.length; if (mLength >= length) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index d680f36..c7695e8 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -3250,7 +3250,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener sendOnTextChanged(text, 0, oldlen, textLength); onTextChanged(text, 0, oldlen, textLength); - if (startSpellCheck) { + if (startSpellCheck && mSpellChecker != null) { + // This view has to have been previously attached for mSpellChecker to exist updateSpellCheckSpans(0, textLength); } @@ -4412,6 +4413,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Resolve drawables as the layout direction has been resolved resolveDrawables(); + + updateSpellCheckSpans(0, mText.length()); } @Override @@ -4443,6 +4446,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener hideControllers(); resetResolvedDrawables(); + + if (mSpellChecker != null) { + mSpellChecker.closeSession(); + removeMisspelledSpans(); + // Forces the creation of a new SpellChecker next time this window is created. + // Will handle the cases where the settings has been changed in the meantime. + mSpellChecker = null; + } } @Override @@ -7595,7 +7606,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } ims.mChangedDelta += after-before; } - + sendOnTextChanged(buffer, start, before, after); onTextChanged(buffer, start, before, after); @@ -7737,7 +7748,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * Create new SpellCheckSpans on the modified region. */ private void updateSpellCheckSpans(int start, int end) { - if (!(mText instanceof Editable) || !isSuggestionsEnabled()) return; + if (!isTextEditable() || !isSuggestionsEnabled() || !getSpellChecker().isSessionActive()) + return; Editable text = (Editable) mText; WordIterator wordIterator = getWordIterator(); @@ -8427,13 +8439,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int flags = suggestionSpans[i].getFlags(); if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0 && (flags & SuggestionSpan.FLAG_MISSPELLED) == 0) { - flags = flags & ~SuggestionSpan.FLAG_EASY_CORRECT; + flags &= ~SuggestionSpan.FLAG_EASY_CORRECT; suggestionSpans[i].setFlags(flags); } } } } + /** + * Removes the suggestion spans for misspelled words. + */ + private void removeMisspelledSpans() { + if (mText instanceof Spannable) { + Spannable spannable = (Spannable) mText; + SuggestionSpan[] suggestionSpans = spannable.getSpans(0, + spannable.length(), SuggestionSpan.class); + for (int i = 0; i < suggestionSpans.length; i++) { + int flags = suggestionSpans[i].getFlags(); + if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0 + && (flags & SuggestionSpan.FLAG_MISSPELLED) != 0) { + spannable.removeSpan(suggestionSpans[i]); + } + } + } + } + @Override public boolean onGenericMotionEvent(MotionEvent event) { if (mMovement != null && mText instanceof Spannable && mLayout != null) { @@ -8944,13 +8974,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final boolean isPassword = hasPasswordTransformationMethod(); if (!isPassword) { - CharSequence text = getText(); - if (TextUtils.isEmpty(text)) { - text = getHint(); - } - if (TextUtils.isEmpty(text)) { - text = getContentDescription(); - } + CharSequence text = getTextForAccessibility(); if (!TextUtils.isEmpty(text)) { event.getText().add(text); } @@ -8977,7 +9001,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final boolean isPassword = hasPasswordTransformationMethod(); if (!isPassword) { - info.setText(getText()); + info.setText(getTextForAccessibility()); } info.setPassword(isPassword); } @@ -8993,6 +9017,20 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener super.sendAccessibilityEvent(eventType); } + /** + * Gets the text reported for accessibility purposes. It is the + * text if not empty or the hint. + * + * @return The accessibility text. + */ + private CharSequence getTextForAccessibility() { + CharSequence text = getText(); + if (TextUtils.isEmpty(text)) { + text = getHint(); + } + return text; + } + void sendAccessibilityEventTypeViewTextChanged(CharSequence beforeText, int fromIndex, int removedCount, int addedCount) { AccessibilityEvent event = @@ -9565,7 +9603,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private final Comparator<SuggestionSpan> mSuggestionSpanComparator; private final HashMap<SuggestionSpan, Integer> mSpansLengths; - private class CustomPopupWindow extends PopupWindow { public CustomPopupWindow(Context context, int defStyle) { super(context, null, defStyle); @@ -9577,9 +9614,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener TextView.this.getPositionListener().removeSubscriber(SuggestionsPopupWindow.this); - if ((mText instanceof Spannable)) { - ((Spannable) mText).removeSpan(mSuggestionRangeSpan); - } + // Safe cast since show() checks that mText is an Editable + ((Spannable) mText).removeSpan(mSuggestionRangeSpan); setCursorVisible(mCursorWasVisibleBeforeSuggestions); if (hasInsertionController()) { @@ -9629,8 +9665,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener void removeMisspelledFlag() { int suggestionSpanFlags = suggestionSpan.getFlags(); if ((suggestionSpanFlags & SuggestionSpan.FLAG_MISSPELLED) > 0) { - suggestionSpanFlags &= ~(SuggestionSpan.FLAG_MISSPELLED); - suggestionSpanFlags &= ~(SuggestionSpan.FLAG_EASY_CORRECT); + suggestionSpanFlags &= ~SuggestionSpan.FLAG_MISSPELLED; + suggestionSpanFlags &= ~SuggestionSpan.FLAG_EASY_CORRECT; suggestionSpan.setFlags(suggestionSpanFlags); } } @@ -10512,9 +10548,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public abstract int getCurrentCursorOffset(); - protected void updateSelection(int offset) { - updateDrawable(); - } + protected abstract void updateSelection(int offset); public abstract void updatePosition(float x, float y); @@ -10788,8 +10822,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override public void updateSelection(int offset) { - super.updateSelection(offset); Selection.setSelection((Spannable) mText, offset, getSelectionEnd()); + updateDrawable(); } @Override @@ -10830,8 +10864,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override public void updateSelection(int offset) { - super.updateSelection(offset); Selection.setSelection((Spannable) mText, getSelectionStart(), offset); + updateDrawable(); } @Override diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index fba6a5a..aabea2c 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -24,6 +24,7 @@ import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseBooleanArray; +import android.view.ActionProvider; import android.view.MenuItem; import android.view.SoundEffectConstants; import android.view.View; @@ -40,7 +41,8 @@ import java.util.ArrayList; /** * MenuPresenter for building action menus as seen in the action bar and action modes. */ -public class ActionMenuPresenter extends BaseMenuPresenter { +public class ActionMenuPresenter extends BaseMenuPresenter + implements ActionProvider.SubUiVisibilityListener { private static final String TAG = "ActionMenuPresenter"; private View mOverflowButton; @@ -187,8 +189,30 @@ public class ActionMenuPresenter extends BaseMenuPresenter { public void updateMenuView(boolean cleared) { super.updateMenuView(cleared); - final boolean hasOverflow = mReserveOverflow && mMenu != null && - mMenu.getNonActionItems().size() > 0; + if (mMenu != null) { + final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems(); + final int count = actionItems.size(); + for (int i = 0; i < count; i++) { + final ActionProvider provider = actionItems.get(i).getActionProvider(); + if (provider != null) { + provider.setSubUiVisibilityListener(this); + } + } + } + + final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ? + mMenu.getNonActionItems() : null; + + boolean hasOverflow = false; + if (mReserveOverflow && nonActionItems != null) { + final int count = nonActionItems.size(); + if (count == 1) { + hasOverflow = !nonActionItems.get(0).isActionViewExpanded(); + } else { + hasOverflow = count > 0; + } + } + if (hasOverflow) { if (mOverflowButton == null) { mOverflowButton = new OverflowMenuButton(mContext); @@ -483,6 +507,16 @@ public class ActionMenuPresenter extends BaseMenuPresenter { } } + @Override + public void onSubUiVisibilityChanged(boolean isVisible) { + if (isVisible) { + // Not a submenu, but treat it like one. + super.onSubMenuSelected(null); + } else { + mMenu.close(false); + } + } + private static class SavedState implements Parcelable { public int openSubMenuId; @@ -590,7 +624,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public void onDismiss() { super.onDismiss(); - mSubMenu.close(); mActionButtonPopup = null; mOpenSubMenuId = 0; } @@ -600,12 +633,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); return false; } @Override public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu instanceof SubMenuBuilder) { + ((SubMenuBuilder) menu).getRootMenu().close(false); + } } } diff --git a/core/java/com/android/internal/view/menu/IconMenuPresenter.java b/core/java/com/android/internal/view/menu/IconMenuPresenter.java index d1b1dae..24ddad6 100644 --- a/core/java/com/android/internal/view/menu/IconMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/IconMenuPresenter.java @@ -187,7 +187,9 @@ public class IconMenuPresenter extends BaseMenuPresenter { @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { - mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + if (subMenu != null) { + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + } return false; } diff --git a/core/java/com/android/internal/view/menu/ListMenuPresenter.java b/core/java/com/android/internal/view/menu/ListMenuPresenter.java index 0141427..a331bec 100644 --- a/core/java/com/android/internal/view/menu/ListMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ListMenuPresenter.java @@ -17,6 +17,7 @@ package com.android.internal.view.menu; import android.content.Context; +import android.database.DataSetObserver; import android.os.Bundle; import android.os.Parcelable; import android.util.SparseArray; @@ -47,7 +48,7 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick int mItemLayoutRes; private Callback mCallback; - private MenuAdapter mAdapter; + MenuAdapter mAdapter; private int mId; @@ -216,14 +217,29 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick } private class MenuAdapter extends BaseAdapter { + private int mExpandedIndex = -1; + + public MenuAdapter() { + registerDataSetObserver(new ExpandedIndexObserver()); + findExpandedIndex(); + } + public int getCount() { ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); - return items.size() - mItemIndexOffset; + int count = items.size() - mItemIndexOffset; + if (mExpandedIndex < 0) { + return count; + } + return count - 1; } public MenuItemImpl getItem(int position) { ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); - return items.get(position + mItemIndexOffset); + position += mItemIndexOffset; + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } + return items.get(position); } public long getItemId(int position) { @@ -241,5 +257,28 @@ public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClick itemView.initialize(getItem(position), 0); return convertView; } + + void findExpandedIndex() { + final MenuItemImpl expandedItem = mMenu.getExpandedItem(); + if (expandedItem != null) { + final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); + final int count = items.size(); + for (int i = 0; i < count; i++) { + final MenuItemImpl item = items.get(i); + if (item == expandedItem) { + mExpandedIndex = i; + return; + } + } + } + mExpandedIndex = -1; + } + } + + private class ExpandedIndexObserver extends DataSetObserver { + @Override + public void onChanged() { + mAdapter.findExpandedIndex(); + } } } diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index c30e83b..9fbca82 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -1258,4 +1258,8 @@ public class MenuBuilder implements Menu { } return collapsed; } + + public MenuItemImpl getExpandedItem() { + return mExpandedItem; + } } diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java index 6265618..329b457 100644 --- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java +++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java @@ -18,6 +18,7 @@ package com.android.internal.view.menu; import android.content.Context; import android.content.res.Resources; +import android.database.DataSetObserver; import android.os.Parcelable; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -286,22 +287,45 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On return false; } + @Override + public int getId() { + return 0; + } + + @Override + public Parcelable onSaveInstanceState() { + return null; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + } + private class MenuAdapter extends BaseAdapter { private MenuBuilder mAdapterMenu; + private int mExpandedIndex = -1; public MenuAdapter(MenuBuilder menu) { mAdapterMenu = menu; + registerDataSetObserver(new ExpandedIndexObserver()); + findExpandedIndex(); } public int getCount() { ArrayList<MenuItemImpl> items = mOverflowOnly ? mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); - return items.size(); + if (mExpandedIndex < 0) { + return items.size(); + } + return items.size() - 1; } public MenuItemImpl getItem(int position) { ArrayList<MenuItemImpl> items = mOverflowOnly ? mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } return items.get(position); } @@ -323,19 +347,28 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On itemView.initialize(getItem(position), 0); return convertView; } - } - - @Override - public int getId() { - return 0; - } - @Override - public Parcelable onSaveInstanceState() { - return null; + void findExpandedIndex() { + final MenuItemImpl expandedItem = mMenu.getExpandedItem(); + if (expandedItem != null) { + final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems(); + final int count = items.size(); + for (int i = 0; i < count; i++) { + final MenuItemImpl item = items.get(i); + if (item == expandedItem) { + mExpandedIndex = i; + return; + } + } + } + mExpandedIndex = -1; + } } - @Override - public void onRestoreInstanceState(Parcelable state) { + private class ExpandedIndexObserver extends DataSetObserver { + @Override + public void onChanged() { + mAdapter.findExpandedIndex(); + } } } diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java index 6c11288..06f5158 100644 --- a/core/java/com/android/internal/widget/AbsActionBarView.java +++ b/core/java/com/android/internal/widget/AbsActionBarView.java @@ -35,6 +35,8 @@ public abstract class AbsActionBarView extends ViewGroup { protected ActionMenuView mMenuView; protected ActionMenuPresenter mActionMenuPresenter; protected ActionBarContainer mSplitView; + protected boolean mSplitActionBar; + protected boolean mSplitWhenNarrow; protected int mContentHeight; protected Animator mVisibilityAnim; @@ -66,11 +68,31 @@ public abstract class AbsActionBarView extends ViewGroup { com.android.internal.R.attr.actionBarStyle, 0); setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0)); a.recycle(); + if (mSplitWhenNarrow) { + setSplitActionBar(getContext().getResources().getBoolean( + com.android.internal.R.bool.split_action_bar_is_narrow)); + } if (mActionMenuPresenter != null) { mActionMenuPresenter.onConfigurationChanged(newConfig); } } + /** + * Sets whether the bar should be split right now, no questions asked. + * @param split true if the bar should split + */ + public void setSplitActionBar(boolean split) { + mSplitActionBar = split; + } + + /** + * Sets whether the bar should split if we enter a narrow screen configuration. + * @param splitWhenNarrow true if the bar should check to split after a config change + */ + public void setSplitWhenNarrow(boolean splitWhenNarrow) { + mSplitWhenNarrow = splitWhenNarrow; + } + public void setContentHeight(int height) { mContentHeight = height; requestLayout(); diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java index 7bc33c7..acffa5c 100644 --- a/core/java/com/android/internal/widget/ActionBarContextView.java +++ b/core/java/com/android/internal/widget/ActionBarContextView.java @@ -93,6 +93,39 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi a.recycle(); } + @Override + public void setSplitActionBar(boolean split) { + if (mSplitActionBar != split) { + if (mActionMenuPresenter != null) { + // Mode is already active; move everything over and adjust the menu itself. + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!split) { + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(null); + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) oldParent.removeView(mMenuView); + addView(mMenuView, layoutParams); + } else { + // Allow full screen width in split mode. + mActionMenuPresenter.setWidthLimit( + getContext().getResources().getDisplayMetrics().widthPixels, true); + // No limit to the item count; use whatever will fit. + mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); + // Span the whole width + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = mContentHeight; + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(mSplitBackground); + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) oldParent.removeView(mMenuView); + mSplitView.addView(mMenuView, layoutParams); + } + } + super.setSplitActionBar(split); + } + } + public void setContentHeight(int height) { mContentHeight = height; } @@ -179,7 +212,7 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); - if (mSplitView == null) { + if (!mSplitActionBar) { menu.addMenuPresenter(mActionMenuPresenter); mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); mMenuView.setBackgroundDrawable(null); diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index bbecb6c..dc8feea 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -113,7 +113,6 @@ public class ActionBarView extends AbsActionBarView { private int mProgressStyle; private int mIndeterminateProgressStyle; - private boolean mSplitActionBar; private boolean mUserTitle; private boolean mIncludeTabs; private boolean mIsCollapsable; @@ -301,6 +300,7 @@ public class ActionBarView extends AbsActionBarView { addView(mIndeterminateProgressView); } + @Override public void setSplitActionBar(boolean splitActionBar) { if (mSplitActionBar != splitActionBar) { if (mMenuView != null) { @@ -316,7 +316,10 @@ public class ActionBarView extends AbsActionBarView { addView(mMenuView); } } - mSplitActionBar = splitActionBar; + if (mSplitView != null) { + mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE); + } + super.setSplitActionBar(splitActionBar); } } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index e3a4df9..19dc42b 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -756,24 +756,36 @@ public class LockPatternUtils { } /** - * @return Whether the lock password is enabled. + * @return Whether the lock password is enabled, or if it is set as a backup for biometric weak */ public boolean isLockPasswordEnabled() { long mode = getLong(PASSWORD_TYPE_KEY, 0); - return savedPasswordExists() && - (mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC - || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC - || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC - || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX); + long backupMode = getLong(PASSWORD_TYPE_ALTERNATE_KEY, 0); + final boolean passwordEnabled = mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC + || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC + || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC + || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; + final boolean backupEnabled = backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC + || backupMode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC + || backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC + || backupMode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; + + return savedPasswordExists() && (passwordEnabled || + (isBiometricEnabled() && backupEnabled)); } /** - * @return Whether the lock pattern is enabled. + * @return Whether the lock pattern is enabled, or if it is set as a backup for biometric weak */ public boolean isLockPatternEnabled() { + final boolean backupEnabled = + getLong(PASSWORD_TYPE_ALTERNATE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) + == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; + return getBoolean(Settings.Secure.LOCK_PATTERN_ENABLED) - && getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) - == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; + && (getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) + == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING || + (isBiometricEnabled() && backupEnabled)); } /** @@ -923,8 +935,7 @@ public class LockPatternUtils { || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; final boolean secure = isPattern && isLockPatternEnabled() && savedPatternExists() - || isPassword && savedPasswordExists() - || usingBiometricWeak() && isBiometricEnabled(); + || isPassword && savedPasswordExists(); return secure; } diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java index c03f91c..ebd355a 100644 --- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java @@ -114,6 +114,13 @@ public class MultiWaveView extends View { } }; + private AnimatorListener mResetListenerWithPing = new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animator) { + ping(); + switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY); + } + }; + private AnimatorUpdateListener mUpdateListener = new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { invalidateGlobalRegion(mHandleDrawable); @@ -421,7 +428,7 @@ public class MultiWaveView extends View { "x", mWaveCenterX, "y", mWaveCenterY, "onUpdate", mUpdateListener, - "onComplete", mResetListener); + "onComplete", mDragging ? mResetListenerWithPing : mResetListener); } setGrabbedState(OnTriggerListener.NO_HANDLE); diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/core/java/com/android/server/NetworkManagementSocketTagger.java index 9f6ab31..8445ad1 100644 --- a/core/java/com/android/server/NetworkManagementSocketTagger.java +++ b/core/java/com/android/server/NetworkManagementSocketTagger.java @@ -75,30 +75,20 @@ public final class NetworkManagementSocketTagger extends SocketTagger { Log.d(TAG, "tagSocket(" + fd.getInt$() + ") with statsTag=0x" + Integer.toHexString(options.statsTag) + ", statsUid=" + options.statsUid); } - try { - // TODO: skip tagging when options would be no-op - tagSocketFd(fd, options.statsTag, options.statsUid); - } catch (IOException e) { - throw new SocketException("Problem tagging socket", e); - } + // TODO: skip tagging when options would be no-op + tagSocketFd(fd, options.statsTag, options.statsUid); } - private void tagSocketFd(FileDescriptor fd, int tag, int uid) throws IOException { - final int fdNum = fd.getInt$(); - if (fdNum == -1 || (tag == -1 && uid == -1)) return; - - String cmd = "t " + fdNum; - if (tag == -1) { - // Case where just the uid needs adjusting. But probably the caller - // will want to track his own name here, just in case. - cmd += " 0"; - } else { - cmd += " " + tagToKernel(tag); - } - if (uid != -1) { - cmd += " " + uid; + private void tagSocketFd(FileDescriptor fd, int tag, int uid) { + int errno; + if (tag == -1 && uid == -1) return; + + errno = native_tagSocketFd(fd, tag, uid); + if (errno < 0) { + Log.i(TAG, "tagSocketFd(" + fd.getInt$() + ", " + + tag + ", " + + + uid + ") failed with errno" + errno); } - internalModuleCtrl(cmd); } @Override @@ -106,19 +96,18 @@ public final class NetworkManagementSocketTagger extends SocketTagger { if (LOGD) { Log.i(TAG, "untagSocket(" + fd.getInt$() + ")"); } - try { - unTagSocketFd(fd); - } catch (IOException e) { - throw new SocketException("Problem untagging socket", e); - } + unTagSocketFd(fd); } - private void unTagSocketFd(FileDescriptor fd) throws IOException { - int fdNum = fd.getInt$(); + private void unTagSocketFd(FileDescriptor fd) { final SocketTags options = threadSocketTags.get(); - if (fdNum == -1 || (options.statsTag == -1 && options.statsUid == -1)) return; - String cmd = "u " + fdNum; - internalModuleCtrl(cmd); + int errno; + if (options.statsTag == -1 && options.statsUid == -1) return; + + errno = native_untagSocketFd(fd); + if (errno < 0) { + Log.w(TAG, "untagSocket(" + fd.getInt$() + ") failed with errno " + errno); + } } public static class SocketTags { @@ -127,69 +116,20 @@ public final class NetworkManagementSocketTagger extends SocketTagger { } public static void setKernelCounterSet(int uid, int counterSet) { - final StringBuilder command = new StringBuilder(); - command.append("s ").append(counterSet).append(" ").append(uid); - try { - internalModuleCtrl(command.toString()); - } catch (IOException e) { - Slog.w(TAG, "problem changing counter set for uid " + uid + " : " + e); + int errno = native_setCounterSet(counterSet, uid); + if (errno < 0) { + Log.w(TAG, "setKernelCountSet(" + uid + ", " + counterSet + ") failed with errno " + errno); } } public static void resetKernelUidStats(int uid) { - final StringBuilder command = new StringBuilder(); - command.append("d 0 ").append(uid); - try { - internalModuleCtrl(command.toString()); - } catch (IOException e) { - Slog.w(TAG, "problem clearing counters for uid " + uid + " : " + e); + int errno = native_deleteTagData(0, uid); + if (errno < 0) { + Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno); } } /** - * Sends commands to the kernel netfilter module. - * - * @param cmd command string for the qtaguid netfilter module. May not be null. - * <p>Supports: - * <ul><li>tag a socket:<br> - * <code>t <i>sock_fd</i> <i>acct_tag</i> [<i>uid_in_case_caller_is_acting_on_behalf_of</i>]</code><br> - * <code>*_tag</code> defaults to default_policy_tag_from_uid(uid_of_caller)<br> - * <code>acct_tag</code> is either 0 or greater that 2^32.<br> - * <code>uid_*</code> is only settable by privileged UIDs (DownloadManager,...) - * </li> - * <li>untag a socket, preserving counters:<br> - * <code>u <i>sock_fd</i></code> - * </li></ul> - * <p>Notes:<br> - * <ul><li><i>sock_fd</i> is withing the callers process space.</li> - * <li><i>*_tag</i> are 64bit values</li></ul> - * - */ - private static void internalModuleCtrl(String cmd) throws IOException { - if (!SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) return; - - // TODO: migrate to native library for tagging commands - FileOutputStream procOut = null; - try { - procOut = new FileOutputStream("/proc/net/xt_qtaguid/ctrl"); - procOut.write(cmd.getBytes(Charsets.US_ASCII)); - } finally { - IoUtils.closeQuietly(procOut); - } - } - - /** - * Convert {@link Integer} tag to {@code /proc/} format. Assumes unsigned - * base-10 format like {@code 2147483647}. Currently strips signed bit to - * avoid using {@link BigInteger}. - */ - public static String tagToKernel(int tag) { - // TODO: eventually write in hex, since that's what proc exports - // TODO: migrate to direct integer instead of odd shifting - return Long.toString((((long) tag) << 32) & 0x7FFFFFFF00000000L); - } - - /** * Convert {@code /proc/} tag format to {@link Integer}. Assumes incoming * format like {@code 0x7fffffff00000000}. */ @@ -197,4 +137,9 @@ public final class NetworkManagementSocketTagger extends SocketTagger { // TODO: migrate to direct integer instead of odd shifting return (int) (Long.decode(string) >> 32); } + + private static native int native_tagSocketFd(FileDescriptor fd, int tag, int uid); + private static native int native_untagSocketFd(FileDescriptor fd); + private static native int native_setCounterSet(int uid, int counterSetNum); + private static native int native_deleteTagData(int tag, int uid); } diff --git a/core/jni/Android.mk b/core/jni/Android.mk index aece5f0..59a03e7 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -143,6 +143,7 @@ LOCAL_SRC_FILES:= \ android_server_BluetoothService.cpp \ android_server_BluetoothEventLoop.cpp \ android_server_BluetoothA2dpService.cpp \ + android_server_NetworkManagementSocketTagger.cpp \ android_server_Watchdog.cpp \ android_ddm_DdmHandleNativeHeap.cpp \ com_android_internal_os_ZygoteInit.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index dd7dd86..12ec1b6 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -155,6 +155,7 @@ extern int register_android_bluetooth_BluetoothSocket(JNIEnv *env); extern int register_android_server_BluetoothService(JNIEnv* env); extern int register_android_server_BluetoothEventLoop(JNIEnv *env); extern int register_android_server_BluetoothA2dpService(JNIEnv* env); +extern int register_android_server_NetworkManagementSocketTagger(JNIEnv* env); extern int register_android_server_Watchdog(JNIEnv* env); extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env); extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env); @@ -1178,6 +1179,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_server_BluetoothService), REG_JNI(register_android_server_BluetoothEventLoop), REG_JNI(register_android_server_BluetoothA2dpService), + REG_JNI(register_android_server_NetworkManagementSocketTagger), REG_JNI(register_android_server_Watchdog), REG_JNI(register_android_ddm_DdmHandleNativeHeap), REG_JNI(register_android_backup_BackupDataInput), diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index 9313d0a..02c5bb3 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -758,21 +758,7 @@ public: jfloat x, jfloat y, int flags, SkPaint* paint) { jint count = end - start; - sp<TextLayoutCacheValue> value; -#if USE_TEXT_LAYOUT_CACHE - value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count, - end, flags); - if (value == NULL) { - LOGE("Cannot get TextLayoutCache value"); - return ; - } -#else - value = new TextLayoutCacheValue(); - value->computeValues(paint, textArray, start, count, end, flags); -#endif - - doDrawGlyphs(canvas, value->getGlyphs(), 0, value->getGlyphsCount(), - x, y, flags, paint); + drawTextWithGlyphs(canvas, textArray + start, 0, count, count, x, y, flags, paint); } static void drawTextWithGlyphs(SkCanvas* canvas, const jchar* textArray, @@ -781,19 +767,20 @@ public: sp<TextLayoutCacheValue> value; #if USE_TEXT_LAYOUT_CACHE - value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count, - contextCount, flags); + value = TextLayoutCache::getInstance().getValue(paint, textArray, contextCount, flags); if (value == NULL) { LOGE("Cannot get TextLayoutCache value"); return ; } #else value = new TextLayoutCacheValue(); - value->computeValues(paint, textArray, start, count, contextCount, flags); + value->computeValues(paint, textArray, contextCount, flags); #endif - - doDrawGlyphs(canvas, value->getGlyphs(), 0, value->getGlyphsCount(), - x, y, flags, paint); + size_t startIndex = 0; + size_t glyphsCount = 0; + value->getGlyphsIndexAndCount(start, count, &startIndex, &glyphsCount); + const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount); + doDrawGlyphs(canvas, glyphs, 0, glyphsCount, x, y, flags, paint); } static void doDrawGlyphs(SkCanvas* canvas, const jchar* glyphArray, int index, int count, diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 7d222f6..3daf7d0 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -352,7 +352,7 @@ public: jfloat result = 0; #if RTL_USE_HARFBUZZ TextLayout::getTextRunAdvances(paint, textArray, index, count, textLength, - paint->getFlags(), NULL /* dont need all advances */, result); + paint->getFlags(), NULL /* dont need all advances */, &result); #else // we double count, since measureText wants a byteLength SkScalar width = paint->measureText(textArray + index, count << 1); @@ -382,7 +382,7 @@ public: #if RTL_USE_HARFBUZZ TextLayout::getTextRunAdvances(paint, textArray, start, count, textLength, - paint->getFlags(), NULL /* dont need all advances */, width); + paint->getFlags(), NULL /* dont need all advances */, &width); #else width = SkScalarToFloat(paint->measureText(textArray + start, count << 1)); @@ -406,7 +406,7 @@ public: #if RTL_USE_HARFBUZZ TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength, - paint->getFlags(), NULL /* dont need all advances */, width); + paint->getFlags(), NULL /* dont need all advances */, &width); #else width = SkScalarToFloat(paint->measureText(textArray, textLength << 1)); #endif @@ -435,10 +435,8 @@ public: jfloat* widthsArray = autoWidths.ptr(); #if RTL_USE_HARFBUZZ - jfloat totalAdvance; - TextLayout::getTextRunAdvances(paint, text, 0, count, count, - paint->getFlags(), widthsArray, totalAdvance); + paint->getFlags(), widthsArray, NULL /* dont need totalAdvance */); #else SkScalar* scalarArray = (SkScalar*)widthsArray; @@ -533,7 +531,7 @@ public: jfloat totalAdvance = 0; TextLayout::getTextRunAdvances(paint, text, start, count, contextCount, flags, - advancesArray, totalAdvance); + advancesArray, &totalAdvance); if (advances != NULL) { env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray); @@ -604,10 +602,9 @@ public: jint count, jint flags, jint offset, jint opt) { #if RTL_USE_HARFBUZZ jfloat scalarArray[count]; - jfloat totalAdvance = 0; TextLayout::getTextRunAdvances(paint, text, start, count, count, flags, - scalarArray, totalAdvance); + scalarArray, NULL /* dont need totalAdvance */); #else SkScalar scalarArray[count]; jchar buffer[count]; diff --git a/core/jni/android/graphics/TextLayout.cpp b/core/jni/android/graphics/TextLayout.cpp index fa9a7b7..ae17aed 100644 --- a/core/jni/android/graphics/TextLayout.cpp +++ b/core/jni/android/graphics/TextLayout.cpp @@ -253,37 +253,30 @@ void TextLayout::drawTextRun(SkPaint* paint, const jchar* chars, void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint start, jint count, jint contextCount, jint dirFlags, - jfloat* resultAdvances, jfloat& resultTotalAdvance) { + jfloat* resultAdvances, jfloat* resultTotalAdvance) { sp<TextLayoutCacheValue> value; #if USE_TEXT_LAYOUT_CACHE // Return advances from the cache. Compute them if needed - value = TextLayoutCache::getInstance().getValue( - paint, chars, start, count, contextCount, dirFlags); + value = TextLayoutCache::getInstance().getValue(paint, chars, contextCount, dirFlags); #else value = new TextLayoutCacheValue(); - value->computeValues(paint, chars, start, count, contextCount, dirFlags); + value->computeValues(paint, chars, contextCount, dirFlags); #endif if (value != NULL) { if (resultAdvances != NULL) { - memcpy(resultAdvances, value->getAdvances(), value->getAdvancesCount() * sizeof(jfloat)); + value->getAdvances(start, count, resultAdvances); + } + if (resultTotalAdvance) { + *resultTotalAdvance = value->getTotalAdvance(start, count); } - resultTotalAdvance = value->getTotalAdvance(); } } -void TextLayout::getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start, - jint count, jint contextCount, jint dirFlags, - jfloat* resultAdvances, jfloat& resultTotalAdvance) { - // Compute advances and return them - TextLayoutCacheValue::computeValuesWithHarfbuzz(paint, chars, start, count, contextCount, - dirFlags, resultAdvances, &resultTotalAdvance, NULL, NULL); -} - void TextLayout::getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint start, jint count, jint contextCount, jint dirFlags, jfloat* resultAdvances, jfloat& resultTotalAdvance) { // Compute advances and return them - TextLayoutCacheValue::computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags, + computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags, resultAdvances, &resultTotalAdvance); } @@ -321,4 +314,73 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count, } } +void TextLayout::computeAdvancesWithICU(SkPaint* paint, const UChar* chars, + size_t start, size_t count, size_t contextCount, int dirFlags, + jfloat* outAdvances, jfloat* outTotalAdvance) { + SkAutoSTMalloc<CHAR_BUFFER_SIZE, jchar> tempBuffer(contextCount); + jchar* buffer = tempBuffer.get(); + SkScalar* scalarArray = (SkScalar*)outAdvances; + + // this is where we'd call harfbuzz + // for now we just use ushape.c + size_t widths; + const jchar* text; + if (dirFlags & 0x1) { // rtl, call arabic shaping in case + UErrorCode status = U_ZERO_ERROR; + // Use fixed length since we need to keep start and count valid + u_shapeArabic(chars, contextCount, buffer, contextCount, + U_SHAPE_LENGTH_FIXED_SPACES_NEAR | + U_SHAPE_TEXT_DIRECTION_LOGICAL | U_SHAPE_LETTERS_SHAPE | + U_SHAPE_X_LAMALEF_SUB_ALTERNATE, &status); + // we shouldn't fail unless there's an out of memory condition, + // in which case we're hosed anyway + for (int i = start, e = i + count; i < e; ++i) { + if (buffer[i] == UNICODE_NOT_A_CHAR) { + buffer[i] = UNICODE_ZWSP; // zero-width-space for skia + } + } + text = buffer + start; + widths = paint->getTextWidths(text, count << 1, scalarArray); + } else { + text = chars + start; + widths = paint->getTextWidths(text, count << 1, scalarArray); + } + + jfloat totalAdvance = 0; + if (widths < count) { +#if DEBUG_ADVANCES + LOGD("ICU -- count=%d", widths); +#endif + // Skia operates on code points, not code units, so surrogate pairs return only + // one value. Expand the result so we have one value per UTF-16 code unit. + + // Note, skia's getTextWidth gets confused if it encounters a surrogate pair, + // leaving the remaining widths zero. Not nice. + for (size_t i = 0, p = 0; i < widths; ++i) { + totalAdvance += outAdvances[p++] = SkScalarToFloat(scalarArray[i]); + if (p < count && + text[p] >= UNICODE_FIRST_LOW_SURROGATE && + text[p] < UNICODE_FIRST_PRIVATE_USE && + text[p-1] >= UNICODE_FIRST_HIGH_SURROGATE && + text[p-1] < UNICODE_FIRST_LOW_SURROGATE) { + outAdvances[p++] = 0; + } +#if DEBUG_ADVANCES + LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance); +#endif + } + } else { +#if DEBUG_ADVANCES + LOGD("ICU -- count=%d", count); +#endif + for (size_t i = 0; i < count; i++) { + totalAdvance += outAdvances[i] = SkScalarToFloat(scalarArray[i]); +#if DEBUG_ADVANCES + LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance); +#endif + } + } + *outTotalAdvance = totalAdvance; +} + } diff --git a/core/jni/android/graphics/TextLayout.h b/core/jni/android/graphics/TextLayout.h index 0a29d78..9df3829 100644 --- a/core/jni/android/graphics/TextLayout.h +++ b/core/jni/android/graphics/TextLayout.h @@ -71,16 +71,12 @@ public: static void getTextRunAdvances(SkPaint* paint, const jchar* chars, jint start, jint count, jint contextCount, jint dirFlags, - jfloat* resultAdvances, jfloat& resultTotalAdvance); + jfloat* resultAdvances, jfloat* resultTotalAdvance); static void getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint start, jint count, jint contextCount, jint dirFlags, jfloat* resultAdvances, jfloat& resultTotalAdvance); - static void getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start, - jint count, jint contextCount, jint dirFlags, - jfloat* resultAdvances, jfloat& resultTotalAdvance); - static void drawText(SkPaint* paint, const jchar* text, jsize len, jint bidiFlags, jfloat x, jfloat y, SkCanvas* canvas); @@ -106,5 +102,9 @@ private: UErrorCode &status); static void handleText(SkPaint* paint, const jchar* text, jsize len, int bidiFlags, jfloat x, jfloat y, SkCanvas* canvas, SkPath* path); + + static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars, + size_t start, size_t count, size_t contextCount, int dirFlags, + jfloat* outAdvances, jfloat* outTotalAdvance); }; } // namespace android diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index d04e059..c045c07 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -52,13 +52,7 @@ void TextLayoutCache::init() { mCacheStartTime = systemTime(SYSTEM_TIME_MONOTONIC); if (mDebugEnabled) { - LOGD("Start time: %lld", mCacheStartTime); -#if RTL_USE_HARFBUZZ - LOGD("Using HARFBUZZ"); -#else - LOGD("Using ICU"); -#endif - LOGD("Initialization is done"); + LOGD("Initialization is done - Start time: %lld", mCacheStartTime); } mInitialized = true; @@ -112,7 +106,7 @@ void TextLayoutCache::clear() { * Caching */ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint, - const jchar* text, jint start, jint count, jint contextCount, jint dirFlags) { + const jchar* text, jint count, jint dirFlags) { AutoMutex _l(mLock); nsecs_t startTime = 0; if (mDebugEnabled) { @@ -120,7 +114,7 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint, } // Create the key - TextLayoutCacheKey key(paint, text, start, count, contextCount, dirFlags); + TextLayoutCacheKey key(paint, text, count, dirFlags); // Get value from cache if possible sp<TextLayoutCacheValue> value = mCache.get(key); @@ -134,7 +128,7 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint, value = new TextLayoutCacheValue(); // Compute advances and store them - value->computeValues(paint, text, start, count, contextCount, dirFlags); + value->computeValues(paint, text, count, dirFlags); nsecs_t endTime = systemTime(SYSTEM_TIME_MONOTONIC); @@ -163,20 +157,20 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint, // Update timing information for statistics value->setElapsedTime(endTime - startTime); - LOGD("CACHE MISS: Added entry with start=%d, count=%d, " - "contextCount=%d, entry size %d bytes, remaining space %d bytes" + LOGD("CACHE MISS: Added entry with " + "count=%d, entry size %d bytes, remaining space %d bytes" " - Compute time in nanos: %d - Text='%s' ", - start, count, contextCount, size, mMaxSize - mSize, value->getElapsedTime(), - String8(text, contextCount).string()); + count, size, mMaxSize - mSize, value->getElapsedTime(), + String8(text, count).string()); } } else { if (mDebugEnabled) { LOGD("CACHE MISS: Calculated but not storing entry because it is too big " - "with start=%d, count=%d, contextCount=%d, " + "with count=%d, " "entry size %d bytes, remaining space %d bytes" " - Compute time in nanos: %lld - Text='%s'", - start, count, contextCount, size, mMaxSize - mSize, endTime, - String8(text, contextCount).string()); + count, size, mMaxSize - mSize, endTime, + String8(text, count).string()); } value.clear(); } @@ -190,12 +184,12 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint, if (value->getElapsedTime() > 0) { float deltaPercent = 100 * ((value->getElapsedTime() - elapsedTimeThruCacheGet) / ((float)value->getElapsedTime())); - LOGD("CACHE HIT #%d with start=%d, count=%d, contextCount=%d " + LOGD("CACHE HIT #%d with count=%d " "- Compute time in nanos: %d - " "Cache get time in nanos: %lld - Gain in percent: %2.2f - Text='%s' ", - mCacheHitCount, start, count, contextCount, + mCacheHitCount, count, value->getElapsedTime(), elapsedTimeThruCacheGet, deltaPercent, - String8(text, contextCount).string()); + String8(text, count).string()); } if (mCacheHitCount % DEFAULT_DUMP_STATS_CACHE_HIT_INTERVAL == 0) { dumpCacheStats(); @@ -224,15 +218,14 @@ void TextLayoutCache::dumpCacheStats() { /** * TextLayoutCacheKey */ -TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), start(0), count(0), contextCount(0), +TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), count(0), dirFlags(0), typeface(NULL), textSize(0), textSkewX(0), textScaleX(0), flags(0), hinting(SkPaint::kNo_Hinting) { } TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, - const UChar* text, size_t start, size_t count, - size_t contextCount, int dirFlags) : - text(text), start(start), count(count), contextCount(contextCount), + const UChar* text, size_t count, int dirFlags) : + text(text), count(count), dirFlags(dirFlags) { typeface = paint->getTypeface(); textSize = paint->getTextSize(); @@ -242,20 +235,33 @@ TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, hinting = paint->getHinting(); } +TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) : + text(NULL), + textCopy(other.textCopy), + count(other.count), + dirFlags(other.dirFlags), + typeface(other.typeface), + textSize(other.textSize), + textSkewX(other.textSkewX), + textScaleX(other.textScaleX), + flags(other.flags), + hinting(other.hinting) { + if (other.text) { + textCopy.setTo(other.text); + } +} + bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const { LTE_INT(count) { - LTE_INT(contextCount) { - LTE_INT(start) { - LTE_INT(typeface) { - LTE_FLOAT(textSize) { - LTE_FLOAT(textSkewX) { - LTE_FLOAT(textScaleX) { - LTE_INT(flags) { - LTE_INT(hinting) { - LTE_INT(dirFlags) { - return strncmp16(text, rhs.text, contextCount) < 0; - } - } + LTE_INT(typeface) { + LTE_FLOAT(textSize) { + LTE_FLOAT(textSkewX) { + LTE_FLOAT(textScaleX) { + LTE_INT(flags) { + LTE_INT(hinting) { + LTE_INT(dirFlags) { + return memcmp(getText(), rhs.getText(), + count * sizeof(UChar)) < 0; } } } @@ -268,25 +274,19 @@ bool TextLayoutCacheKey::operator<(const TextLayoutCacheKey& rhs) const { } void TextLayoutCacheKey::internalTextCopy() { - textCopy.setTo(text, contextCount); - text = textCopy.string(); + textCopy.setTo(text, count); + text = NULL; } size_t TextLayoutCacheKey::getSize() { - return sizeof(TextLayoutCacheKey) + sizeof(UChar) * contextCount; + return sizeof(TextLayoutCacheKey) + sizeof(UChar) * count; } /** * TextLayoutCacheValue */ TextLayoutCacheValue::TextLayoutCacheValue() : - mAdvances(NULL), mTotalAdvance(0), mAdvancesCount(0), - mGlyphs(NULL), mGlyphsCount(0), mElapsedTime(0) { -} - -TextLayoutCacheValue::~TextLayoutCacheValue() { - delete[] mAdvances; - delete[] mGlyphs; + mTotalAdvance(0), mElapsedTime(0) { } void TextLayoutCacheValue::setElapsedTime(uint32_t time) { @@ -297,28 +297,23 @@ uint32_t TextLayoutCacheValue::getElapsedTime() { return mElapsedTime; } -void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars, size_t start, - size_t count, size_t contextCount, int dirFlags) { - mAdvancesCount = count; - mAdvances = new float[count]; +void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars, + size_t contextCount, int dirFlags) { + // Give a hint for advances, glyphs and log clusters vectors size + mAdvances.setCapacity(contextCount); + mGlyphs.setCapacity(contextCount); + mLogClusters.setCapacity(contextCount); -#if RTL_USE_HARFBUZZ - computeValuesWithHarfbuzz(paint, chars, start, count, contextCount, dirFlags, - mAdvances, &mTotalAdvance, &mGlyphs, &mGlyphsCount); -#else - computeAdvancesWithICU(paint, chars, start, count, contextCount, dirFlags, - mAdvances, &mTotalAdvance); -#endif + computeValuesWithHarfbuzz(paint, chars, contextCount, dirFlags, + &mAdvances, &mTotalAdvance, &mGlyphs, &mLogClusters); #if DEBUG_ADVANCES - LOGD("Advances - count=%d - countextCount=%d - totalAdvance=%f - " - "adv[0]=%f adv[1]=%f adv[2]=%f adv[3]=%f", count, contextCount, mTotalAdvance, - mAdvances[0], mAdvances[1], mAdvances[2], mAdvances[3]); + LOGD("Advances - countextCount=%d - totalAdvance=%f", contextCount, mTotalAdvance); #endif } size_t TextLayoutCacheValue::getSize() { - return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvancesCount + - sizeof(jchar) * mGlyphsCount; + return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvances.capacity() + + sizeof(jchar) * mGlyphs.capacity() + sizeof(unsigned short) * mLogClusters.capacity(); } void TextLayoutCacheValue::setupShaperItem(HB_ShaperItem* shaperItem, HB_FontRec* font, @@ -389,27 +384,10 @@ void TextLayoutCacheValue::shapeWithHarfbuzz(HB_ShaperItem* shaperItem, HB_FontR } } -struct GlyphRun { - inline GlyphRun() {} - inline GlyphRun(jchar* glyphs, size_t glyphsCount, bool isRTL) : - glyphs(glyphs), glyphsCount(glyphsCount), isRTL(isRTL) { } - jchar* glyphs; - size_t glyphsCount; - int isRTL; -}; - -void static reverseGlyphArray(jchar* glyphs, size_t count) { - for (size_t i = 0; i < count / 2; i++) { - jchar temp = glyphs[i]; - glyphs[i] = glyphs[count - 1 - i]; - glyphs[count - 1 - i] = temp; - } -} - void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, - size_t start, size_t count, size_t contextCount, int dirFlags, - jfloat* outAdvances, jfloat* outTotalAdvance, - jchar** outGlyphs, size_t* outGlyphsCount) { + size_t contextCount, int dirFlags, + Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance, + Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters) { UBiDiLevel bidiReq = 0; bool forceLTR = false; @@ -429,12 +407,8 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar LOGD("computeValuesWithHarfbuzz -- forcing run with LTR=%d RTL=%d", forceLTR, forceRTL); #endif - computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, forceRTL, - outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount); - - if (forceRTL && *outGlyphsCount > 1) { - reverseGlyphArray(*outGlyphs, *outGlyphsCount); - } + computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount, forceRTL, + outAdvances, outTotalAdvance, outGlyphs, outLogClusters); } else { UBiDi* bidi = ubidi_open(); if (bidi) { @@ -453,42 +427,16 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar bool isRTL = (paraDir == 1); #if DEBUG_GLYPHS LOGD("computeValuesWithHarfbuzz -- processing SINGLE run " - "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL); + "-- run-start=%d run-len=%d isRTL=%d", 0, contextCount, isRTL); #endif - computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, - isRTL, outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount); - - if (isRTL && *outGlyphsCount > 1) { - reverseGlyphArray(*outGlyphs, *outGlyphsCount); - } + computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount, + isRTL, outAdvances, outTotalAdvance, outGlyphs, outLogClusters); } else { - Vector<GlyphRun> glyphRuns; - jchar* runGlyphs; - size_t runGlyphsCount = 0; - int32_t end = start + count; for (size_t i = 0; i < rc; ++i) { int32_t startRun; int32_t lengthRun; UBiDiDirection runDir = ubidi_getVisualRun(bidi, i, &startRun, &lengthRun); - if (startRun >= end) { - break; - } - - int32_t endRun = startRun + lengthRun; - if (endRun <= start) { - continue; - } - - if (startRun < start) { - startRun = start; - } - if (endRun > end) { - endRun = end; - } - - lengthRun = endRun - startRun; - bool isRTL = (runDir == UBIDI_RTL); jfloat runTotalAdvance = 0; #if DEBUG_GLYPHS @@ -498,34 +446,9 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar computeRunValuesWithHarfbuzz(paint, chars, startRun, lengthRun, contextCount, isRTL, outAdvances, &runTotalAdvance, - &runGlyphs, &runGlyphsCount); + outGlyphs, outLogClusters); - outAdvances += lengthRun; *outTotalAdvance += runTotalAdvance; - *outGlyphsCount += runGlyphsCount; -#if DEBUG_GLYPHS - LOGD("computeValuesWithHarfbuzz -- run=%d run-glyphs-count=%d", - i, runGlyphsCount); - for (size_t j = 0; j < runGlyphsCount; j++) { - LOGD(" -- glyphs[%d]=%d", j, runGlyphs[j]); - } -#endif - glyphRuns.push(GlyphRun(runGlyphs, runGlyphsCount, isRTL)); - } - *outGlyphs = new jchar[*outGlyphsCount]; - - jchar* glyphs = *outGlyphs; - for (size_t i = 0; i < glyphRuns.size(); i++) { - const GlyphRun& glyphRun = glyphRuns.itemAt(i); - if (glyphRun.isRTL) { - for (size_t n = 0; n < glyphRun.glyphsCount; n++) { - glyphs[glyphRun.glyphsCount - n - 1] = glyphRun.glyphs[n]; - } - } else { - memcpy(glyphs, glyphRun.glyphs, glyphRun.glyphsCount * sizeof(jchar)); - } - glyphs += glyphRun.glyphsCount; - delete[] glyphRun.glyphs; } } } @@ -535,25 +458,21 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar bool isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL); #if DEBUG_GLYPHS LOGD("computeValuesWithHarfbuzz -- cannot run BiDi, considering a SINGLE Run " - "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL); + "-- run-start=%d run-len=%d isRTL=%d", 0, contextCount, isRTL); #endif - computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, isRTL, - outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount); - - if (isRTL && *outGlyphsCount > 1) { - reverseGlyphArray(*outGlyphs, *outGlyphsCount); - } + computeRunValuesWithHarfbuzz(paint, chars, 0, contextCount, contextCount, isRTL, + outAdvances, outTotalAdvance, outGlyphs, outLogClusters); } } #if DEBUG_GLYPHS - LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", *outGlyphsCount); + LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", outGlyphs->size()); #endif } static void logGlyphs(HB_ShaperItem shaperItem) { LOGD("Got glyphs - count=%d", shaperItem.num_glyphs); for (size_t i = 0; i < shaperItem.num_glyphs; i++) { - LOGD(" glyphs[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i], + LOGD(" glyph[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i], HBFixedToFloat(shaperItem.offsets[i].x), HBFixedToFloat(shaperItem.offsets[i].y)); } @@ -561,12 +480,13 @@ static void logGlyphs(HB_ShaperItem shaperItem) { void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, bool isRTL, - jfloat* outAdvances, jfloat* outTotalAdvance, - jchar** outGlyphs, size_t* outGlyphsCount) { + Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance, + Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters) { HB_ShaperItem shaperItem; HB_FontRec font; FontData fontData; + shapeWithHarfbuzz(&shaperItem, &font, &fontData, paint, chars, start, count, contextCount, isRTL); @@ -583,30 +503,28 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC #if DEBUG_GLYPHS LOGD("HARFBUZZ -- advances array is empty or num_glypth = 0"); #endif - for (size_t i = 0; i < count; i++) { - outAdvances[i] = 0; - } + outAdvances->insertAt(0, outAdvances->size(), count); *outTotalAdvance = 0; - if (outGlyphs) { - *outGlyphsCount = 0; - *outGlyphs = new jchar[0]; - } - // Cleaning deleteGlyphArrays(&shaperItem); HB_FreeFace(shaperItem.face); return; } + // Get Advances and their total - jfloat totalAdvance = outAdvances[0] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]); + jfloat currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]); + jfloat totalAdvance = currentAdvance; + outAdvances->add(currentAdvance); for (size_t i = 1; i < count; i++) { size_t clusterPrevious = shaperItem.log_clusters[i - 1]; size_t cluster = shaperItem.log_clusters[i]; if (cluster == clusterPrevious) { - outAdvances[i] = 0; + outAdvances->add(0); } else { - totalAdvance += outAdvances[i] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]); + currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]); + totalAdvance += currentAdvance; + outAdvances->add(currentAdvance); } } *outTotalAdvance = totalAdvance; @@ -614,91 +532,39 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC #if DEBUG_ADVANCES for (size_t i = 0; i < count; i++) { LOGD("hb-adv[%d] = %f - log_clusters = %d - total = %f", i, - outAdvances[i], shaperItem.log_clusters[i], totalAdvance); + (*outAdvances)[i], shaperItem.log_clusters[i], totalAdvance); } #endif - // Get Glyphs + // Get Glyphs and reverse them in place if RTL if (outGlyphs) { - *outGlyphsCount = shaperItem.num_glyphs; - *outGlyphs = new jchar[shaperItem.num_glyphs]; - for (size_t i = 0; i < shaperItem.num_glyphs; i++) { - (*outGlyphs)[i] = (jchar) shaperItem.glyphs[i]; - } - } - - // Cleaning - deleteGlyphArrays(&shaperItem); - HB_FreeFace(shaperItem.face); -} - -void TextLayoutCacheValue::computeAdvancesWithICU(SkPaint* paint, const UChar* chars, - size_t start, size_t count, size_t contextCount, int dirFlags, - jfloat* outAdvances, jfloat* outTotalAdvance) { - SkAutoSTMalloc<CHAR_BUFFER_SIZE, jchar> tempBuffer(contextCount); - jchar* buffer = tempBuffer.get(); - SkScalar* scalarArray = (SkScalar*)outAdvances; - - // this is where we'd call harfbuzz - // for now we just use ushape.c - size_t widths; - const jchar* text; - if (dirFlags & 0x1) { // rtl, call arabic shaping in case - UErrorCode status = U_ZERO_ERROR; - // Use fixed length since we need to keep start and count valid - u_shapeArabic(chars, contextCount, buffer, contextCount, - U_SHAPE_LENGTH_FIXED_SPACES_NEAR | - U_SHAPE_TEXT_DIRECTION_LOGICAL | U_SHAPE_LETTERS_SHAPE | - U_SHAPE_X_LAMALEF_SUB_ALTERNATE, &status); - // we shouldn't fail unless there's an out of memory condition, - // in which case we're hosed anyway - for (int i = start, e = i + count; i < e; ++i) { - if (buffer[i] == UNICODE_NOT_A_CHAR) { - buffer[i] = UNICODE_ZWSP; // zero-width-space for skia - } + size_t countGlyphs = shaperItem.num_glyphs; + for (size_t i = 0; i < countGlyphs; i++) { + jchar glyph = (jchar) shaperItem.glyphs[(!isRTL) ? i : countGlyphs - 1 - i]; +#if DEBUG_GLYPHS + LOGD("HARFBUZZ -- glyph[%d]=%d", i, glyph); +#endif + outGlyphs->add(glyph); } - text = buffer + start; - widths = paint->getTextWidths(text, count << 1, scalarArray); - } else { - text = chars + start; - widths = paint->getTextWidths(text, count << 1, scalarArray); } - jfloat totalAdvance = 0; - if (widths < count) { -#if DEBUG_ADVANCES - LOGD("ICU -- count=%d", widths); -#endif - // Skia operates on code points, not code units, so surrogate pairs return only - // one value. Expand the result so we have one value per UTF-16 code unit. - - // Note, skia's getTextWidth gets confused if it encounters a surrogate pair, - // leaving the remaining widths zero. Not nice. - for (size_t i = 0, p = 0; i < widths; ++i) { - totalAdvance += outAdvances[p++] = SkScalarToFloat(scalarArray[i]); - if (p < count && - text[p] >= UNICODE_FIRST_LOW_SURROGATE && - text[p] < UNICODE_FIRST_PRIVATE_USE && - text[p-1] >= UNICODE_FIRST_HIGH_SURROGATE && - text[p-1] < UNICODE_FIRST_LOW_SURROGATE) { - outAdvances[p++] = 0; - } -#if DEBUG_ADVANCES - LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance); -#endif - } - } else { -#if DEBUG_ADVANCES - LOGD("ICU -- count=%d", count); -#endif - for (size_t i = 0; i < count; i++) { - totalAdvance += outAdvances[i] = SkScalarToFloat(scalarArray[i]); -#if DEBUG_ADVANCES - LOGD("icu-adv = %f - total = %f", outAdvances[i], totalAdvance); + // Get LogClusters + if (outLogClusters) { + size_t countLogClusters = outLogClusters->size(); + size_t countGlyphs = shaperItem.num_glyphs; + for (size_t i = 0; i < countGlyphs; i++) { + // As there may be successive runs, we need to shift the log clusters + unsigned short logCluster = shaperItem.log_clusters[i] + countLogClusters; +#if DEBUG_GLYPHS + LOGD("HARFBUZZ -- logCluster[%d] relative=%d - absolute=%d", i, shaperItem.log_clusters[i], logCluster); #endif + outLogClusters->add(logCluster); } } - *outTotalAdvance = totalAdvance; + + // Cleaning + deleteGlyphArrays(&shaperItem); + HB_FreeFace(shaperItem.face); } void TextLayoutCacheValue::deleteGlyphArrays(HB_ShaperItem* shaperItem) { @@ -726,5 +592,67 @@ void TextLayoutCacheValue::resetGlyphArrays(HB_ShaperItem* shaperItem) { memset(shaperItem->offsets, 0, size * sizeof(shaperItem->offsets[0])); } +void TextLayoutCacheValue::getAdvances(size_t start, size_t count, jfloat* outAdvances) const { + memcpy(outAdvances, mAdvances.array() + start, count * sizeof(jfloat)); +#if DEBUG_ADVANCES + LOGD("getAdvances - start=%d count=%d", start, count); + for (size_t i = 0; i < count; i++) { + LOGD(" adv[%d] = %f", i, outAdvances[i]); + } +#endif +} + +jfloat TextLayoutCacheValue::getTotalAdvance(size_t start, size_t count) const { + jfloat outTotalAdvance = 0; + for (size_t i = start; i < start + count; i++) { + outTotalAdvance += mAdvances[i]; + } +#if DEBUG_ADVANCES + LOGD("getTotalAdvance - start=%d count=%d - total=%f", start, count, outTotalAdvance); +#endif + return outTotalAdvance; +} + +void TextLayoutCacheValue::getGlyphsIndexAndCount(size_t start, size_t count, size_t* outStartIndex, + size_t* outGlyphsCount) const { + *outStartIndex = 0; + if (count == 0) { + *outGlyphsCount = 0; + return; + } + size_t endIndex = 0; + for(size_t i = 0; i < mGlyphs.size(); i++) { + if (mLogClusters[i] <= start) { + *outStartIndex = i; + endIndex = i; + continue; + } + if (mLogClusters[i] <= start + count) { + endIndex = i; + } + } + *outGlyphsCount = endIndex - *outStartIndex + 1; +#if DEBUG_GLYPHS + LOGD("getGlyphsIndexes - start=%d count=%d - startIndex=%d count=%d", start, count, + *outStartIndex, *outGlyphsCount); + for(size_t i = 0; i < mGlyphs.size(); i++) { + LOGD("getGlyphs - all - glyph[%d] = %d", i, mGlyphs[i]); + } + for(size_t i = 0; i < mGlyphs.size(); i++) { + LOGD("getGlyphs - all - logcl[%d] = %d", i, mLogClusters[i]); + } +#endif +} + +const jchar* TextLayoutCacheValue::getGlyphs(size_t startIndex, size_t count) { + const jchar* glyphs = mGlyphs.array() + startIndex; +#if DEBUG_GLYPHS + LOGD("getGlyphs - with startIndex = %d count = %d", startIndex, count); + for (size_t i = 0; i < count; i++) { + LOGD("getGlyphs - result - glyph[%d] = %d", i, glyphs[i]); + } +#endif + return glyphs; +} } // namespace android diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index 0d8d71f..35dd6fd 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -68,9 +68,9 @@ class TextLayoutCacheKey { public: TextLayoutCacheKey(); - TextLayoutCacheKey(const SkPaint* paint, - const UChar* text, size_t start, size_t count, - size_t contextCount, int dirFlags); + TextLayoutCacheKey(const SkPaint* paint, const UChar* text, size_t count, int dirFlags); + + TextLayoutCacheKey(const TextLayoutCacheKey& other); bool operator<(const TextLayoutCacheKey& rhs) const; @@ -86,11 +86,9 @@ public: size_t getSize(); private: - const UChar* text; + const UChar* text; // if text is NULL, use textCopy String16 textCopy; - size_t start; size_t count; - size_t contextCount; int dirFlags; SkTypeface* typeface; SkScalar textSize; @@ -98,29 +96,29 @@ private: SkScalar textScaleX; uint32_t flags; SkPaint::Hinting hinting; + + inline const UChar* getText() const { + return text ? text : textCopy.string(); + } }; // TextLayoutCacheKey /* * TextLayoutCacheValue is the Cache value */ class TextLayoutCacheValue : public RefBase { -protected: - ~TextLayoutCacheValue(); - public: TextLayoutCacheValue(); void setElapsedTime(uint32_t time); uint32_t getElapsedTime(); - void computeValues(SkPaint* paint, const UChar* chars, size_t start, size_t count, - size_t contextCount, int dirFlags); + void computeValues(SkPaint* paint, const UChar* chars, size_t contextCount, int dirFlags); - inline const jfloat* getAdvances() const { return mAdvances; } - inline size_t getAdvancesCount() const { return mAdvancesCount; } - inline jfloat getTotalAdvance() const { return mTotalAdvance; } - inline const jchar* getGlyphs() const { return mGlyphs; } - inline size_t getGlyphsCount() const { return mGlyphsCount; } + void getAdvances(size_t start, size_t count, jfloat* outAdvances) const; + jfloat getTotalAdvance(size_t start, size_t count) const; + void getGlyphsIndexAndCount(size_t start, size_t count, size_t* outStartIndex, + size_t* outGlyphsCount) const; + const jchar* getGlyphs(size_t startIndex, size_t count); /** * Get the size of the Cache entry @@ -135,20 +133,16 @@ public: SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, bool isRTL); - static void computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start, - size_t count, size_t contextCount, int dirFlags, - jfloat* outAdvances, jfloat* outTotalAdvance, - jchar** outGlyphs, size_t* outGlyphsCount); - - static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars, size_t start, - size_t count, size_t contextCount, int dirFlags, - jfloat* outAdvances, jfloat* outTotalAdvance); + static void computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, + size_t contextCount, int dirFlags, + Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance, + Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters); private: /** - * Advances array + * Advances vector */ - jfloat* mAdvances; + Vector<jfloat> mAdvances; /** * Total number of advances @@ -156,19 +150,14 @@ private: jfloat mTotalAdvance; /** - * Allocated size for advances array - */ - size_t mAdvancesCount; - - /** - * Glyphs array + * Glyphs vector */ - jchar* mGlyphs; + Vector<jchar> mGlyphs; /** - * Total number of glyphs + * Harfbuzz Log Clusters */ - size_t mGlyphsCount; + Vector<unsigned short> mLogClusters; /** * Time for computing the values (in milliseconds) @@ -181,8 +170,8 @@ private: static void computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, bool isRTL, - jfloat* outAdvances, jfloat* outTotalAdvance, - jchar** outGlyphs, size_t* outGlyphsCount); + Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance, + Vector<jchar>* const outGlyphs, Vector<unsigned short>* const outLogClusters); }; // TextLayoutCacheValue /** @@ -206,8 +195,8 @@ public: */ void operator()(TextLayoutCacheKey& text, sp<TextLayoutCacheValue>& desc); - sp<TextLayoutCacheValue> getValue(SkPaint* paint, - const jchar* text, jint start, jint count, jint contextCount, jint dirFlags); + sp<TextLayoutCacheValue> getValue(SkPaint* paint, const jchar* text, jint count, + jint dirFlags); /** * Clear the cache diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp new file mode 100644 index 0000000..c279ced --- /dev/null +++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2011, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "NMST_QTagUidNative" +#include <utils/Log.h> + +#include "JNIHelp.h" + +#include "jni.h" +#include <utils/misc.h> +#include <cutils/qtaguid.h> + +#include <errno.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/socket.h> + +namespace android { + +static jint QTagUid_tagSocketFd(JNIEnv* env, jclass, + jobject fileDescriptor, + jint tagNum, jint uid) { + int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor); + + if (env->ExceptionOccurred() != NULL) { + LOGE("Can't get FileDescriptor num"); + return (jint)-1; + } + + int res = qtaguid_tagSocket(userFd, tagNum, uid); + if (res < 0) { + return (jint)-errno; + } + return (jint)res; +} + +static int QTagUid_untagSocketFd(JNIEnv* env, jclass, + jobject fileDescriptor) { + int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor); + + if (env->ExceptionOccurred() != NULL) { + LOGE("Can't get FileDescriptor num"); + return (jint)-1; + } + + int res = qtaguid_untagSocket(userFd); + if (res < 0) { + return (jint)-errno; + } + return (jint)res; +} + +static jint QTagUid_setCounterSet(JNIEnv* env, jclass, + jint setNum, jint uid) { + + int res = qtaguid_setCounterSet(setNum, uid); + if (res < 0) { + return (jint)-errno; + } + return (jint)res; +} + +static jint QTagUid_deleteTagData(JNIEnv* env, jclass, + jint tagNum, jint uid) { + + int res = qtaguid_deleteTagData(tagNum, uid); + if (res < 0) { + return (jint)-errno; + } + return (jint)res; +} + +static JNINativeMethod gQTagUidMethods[] = { + { "native_tagSocketFd", "(Ljava/io/FileDescriptor;II)I", (void*)QTagUid_tagSocketFd}, + { "native_untagSocketFd", "(Ljava/io/FileDescriptor;)I", (void*)QTagUid_untagSocketFd}, + { "native_setCounterSet", "(II)I", (void*)QTagUid_setCounterSet}, + { "native_deleteTagData", "(II)I", (void*)QTagUid_deleteTagData}, +}; + +int register_android_server_NetworkManagementSocketTagger(JNIEnv* env) { + return jniRegisterNativeMethods(env, "com/android/server/NetworkManagementSocketTagger", gQTagUidMethods, NELEM(gQTagUidMethods)); +} + +}; diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 395e417..e542a47 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -477,19 +477,21 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count, #if RTL_USE_HARFBUZZ sp<TextLayoutCacheValue> value; #if USE_TEXT_LAYOUT_CACHE - value = TextLayoutCache::getInstance().getValue(paint, text, 0, count, count, flags); + value = TextLayoutCache::getInstance().getValue(paint, text, count, flags); if (value == NULL) { LOGE("Cannot get TextLayoutCache value"); return ; } #else value = new TextLayoutCacheValue(); - value->computeValues(paint, text, 0, count, count, flags); + value->computeValues(paint, text, count, flags); #endif - const jchar* glyphArray = value->getGlyphs(); - int glyphCount = value->getGlyphsCount(); - int bytesCount = glyphCount * sizeof(jchar); - renderer->drawText((const char*) glyphArray, bytesCount, glyphCount, x, y, paint); + size_t startIndex = 0; + size_t glyphsCount = 0; + value->getGlyphsIndexAndCount(0, count, &startIndex, &glyphsCount); + const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount); + int bytesCount = glyphsCount * sizeof(jchar); + renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint); #else const jchar *workText; jchar* buffer = NULL; @@ -507,19 +509,21 @@ static void renderTextRun(OpenGLRenderer* renderer, const jchar* text, #if RTL_USE_HARFBUZZ sp<TextLayoutCacheValue> value; #if USE_TEXT_LAYOUT_CACHE - value = TextLayoutCache::getInstance().getValue(paint, text, start, count, contextCount, flags); + value = TextLayoutCache::getInstance().getValue(paint, text, contextCount, flags); if (value == NULL) { LOGE("Cannot get TextLayoutCache value"); return ; } #else value = new TextLayoutCacheValue(); - value->computeValues(paint, text, start, count, contextCount, flags); + value->computeValues(paint, text, contextCount, flags); #endif - const jchar* glyphArray = value->getGlyphs(); - int glyphCount = value->getGlyphsCount(); - int bytesCount = glyphCount * sizeof(jchar); - renderer->drawText((const char*) glyphArray, bytesCount, glyphCount, x, y, paint); + size_t startIndex = 0; + size_t glyphsCount = 0; + value->getGlyphsIndexAndCount(start, count, &startIndex, &glyphsCount); + const jchar* glyphs = value->getGlyphs(startIndex, glyphsCount); + int bytesCount = glyphsCount * sizeof(jchar); + renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint); #else uint8_t rtl = flags & 0x1; if (rtl) { diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png Binary files differindex 1d33e47..bf3cabb 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo1.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png Binary files differindex 81fe085..c4f00be 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo2.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png Binary files differindex cf864d2..935e44f 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo3.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png Binary files differindex 583e0c9..03ae28b 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo4.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png Binary files differindex 357b660..b68981f 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo5.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png Binary files differindex 0add340..678b772 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo6.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png Binary files differindex e1a8a63..0aeb0a6 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo7.png diff --git a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png Binary files differindex 934d6d1..1bd7312 100644 --- a/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png +++ b/core/res/res/drawable-hdpi/progressbar_indeterminate_holo8.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png Binary files differindex 4cab1a1..1e5d956 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo1.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png Binary files differindex 2692bd1..d0c0200 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo2.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png Binary files differindex d83cad9..bfdc5ea 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo3.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png Binary files differindex 4ef84a1..1440bc8 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo4.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png Binary files differindex f661b11..4f645fa 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo5.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png Binary files differindex 69df8e0..21966fd 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo6.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png Binary files differindex c34f0a5..7ca15ed 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo7.png diff --git a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png Binary files differindex 2258b20..369d0ac 100644 --- a/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png +++ b/core/res/res/drawable-mdpi/progressbar_indeterminate_holo8.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png Binary files differindex f96a4a6..ca24502 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo1.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png Binary files differindex 3a6554f..5653118 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo2.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png Binary files differindex 30bd7ad..438b1b5 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo3.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png Binary files differindex 209036b..efe3fed 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo4.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png Binary files differindex 830820b..cb7931c 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo5.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png Binary files differindex 39eb204..8ff7ee9 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo6.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png Binary files differindex a2d4dc2..ce07298 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo7.png diff --git a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png Binary files differindex 1772aea..87e9d8f 100644 --- a/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png +++ b/core/res/res/drawable-xhdpi/progressbar_indeterminate_holo8.png diff --git a/core/res/res/drawable/btn_cab_done_holo_dark.xml b/core/res/res/drawable/btn_cab_done_holo_dark.xml index 2cdb605..65d3496 100644 --- a/core/res/res/drawable/btn_cab_done_holo_dark.xml +++ b/core/res/res/drawable/btn_cab_done_holo_dark.xml @@ -14,9 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true" - android:drawable="@drawable/btn_cab_done_default_holo_dark" /> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:exitFadeDuration="@android:integer/config_mediumAnimTime"> <item android:state_pressed="true" android:drawable="@drawable/btn_cab_done_pressed_holo_dark" /> <item android:state_focused="true" android:state_enabled="true" diff --git a/core/res/res/drawable/btn_cab_done_holo_light.xml b/core/res/res/drawable/btn_cab_done_holo_light.xml index 81add4c..f6a63f4 100644 --- a/core/res/res/drawable/btn_cab_done_holo_light.xml +++ b/core/res/res/drawable/btn_cab_done_holo_light.xml @@ -14,9 +14,8 @@ limitations under the License. --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true" - android:drawable="@drawable/btn_cab_done_default_holo_light" /> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + android:exitFadeDuration="@android:integer/config_mediumAnimTime"> <item android:state_pressed="true" android:drawable="@drawable/btn_cab_done_pressed_holo_light" /> <item android:state_focused="true" android:state_enabled="true" diff --git a/core/res/res/drawable/item_background_holo_dark.xml b/core/res/res/drawable/item_background_holo_dark.xml index 2d4f20a..f188df7 100644 --- a/core/res/res/drawable/item_background_holo_dark.xml +++ b/core/res/res/drawable/item_background_holo_dark.xml @@ -17,8 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime"> - <item android:state_window_focused="false" android:drawable="@color/transparent" /> - <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_dark" /> <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_dark" /> diff --git a/core/res/res/drawable/item_background_holo_light.xml b/core/res/res/drawable/item_background_holo_light.xml index c616d86..ee3f4d8 100644 --- a/core/res/res/drawable/item_background_holo_light.xml +++ b/core/res/res/drawable/item_background_holo_light.xml @@ -17,8 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime"> - <item android:state_window_focused="false" android:drawable="@color/transparent" /> - <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_light" /> <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_light" /> diff --git a/core/res/res/layout/keyguard_screen_glogin_unlock.xml b/core/res/res/layout/keyguard_screen_glogin_unlock.xml index 0e5fe78..35d113c 100644 --- a/core/res/res/layout/keyguard_screen_glogin_unlock.xml +++ b/core/res/res/layout/keyguard_screen_glogin_unlock.xml @@ -119,7 +119,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" + android:drawablePadding="4dip" android:text="@android:string/lockscreen_emergency_call" /> diff --git a/core/res/res/layout/keyguard_screen_lock.xml b/core/res/res/layout/keyguard_screen_lock.xml index 6e4fa7d..43867f4 100644 --- a/core/res/res/layout/keyguard_screen_lock.xml +++ b/core/res/res/layout/keyguard_screen_lock.xml @@ -211,7 +211,7 @@ android:layout_marginTop="5dip" android:layout_gravity="center_horizontal" android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" + android:drawablePadding="4dip" android:text="@android:string/lockscreen_emergency_call" /> diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml index 694db50..3343d8b 100644 --- a/core/res/res/layout/keyguard_screen_password_landscape.xml +++ b/core/res/res/layout/keyguard_screen_password_landscape.xml @@ -170,6 +170,7 @@ <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" android:layout_width="270dip" android:layout_height="wrap_content" + android:layout_marginLeft="4dip" android:layout_marginRight="4dip" android:background="#40000000" android:layout_marginTop="5dip" diff --git a/core/res/res/layout/keyguard_screen_password_portrait.xml b/core/res/res/layout/keyguard_screen_password_portrait.xml index cf3bd42..2a66d7d 100644 --- a/core/res/res/layout/keyguard_screen_password_portrait.xml +++ b/core/res/res/layout/keyguard_screen_password_portrait.xml @@ -132,7 +132,7 @@ <!-- Numeric keyboard --> <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_marginLeft="4dip" android:layout_marginRight="4dip" android:paddingTop="4dip" android:paddingBottom="4dip" @@ -178,4 +178,17 @@ android:layout_height="0dip" /> + <!-- Area to overlay FaceLock --> + <TextView android:id="@+id/faceLockAreaView" + android:visibility="gone" + android:layout_row="3" + android:layout_column="0" + android:layout_rowSpan="2" + android:layout_columnSpan="1" + android:layout_gravity="fill" + android:layout_width="0dip" + android:layout_height="0dip" + android:background="@color/facelock_color_background" + /> + </GridLayout> diff --git a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml index dff2a3f..59065e1 100644 --- a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml +++ b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml @@ -113,7 +113,7 @@ android:layout_marginLeft="8dip" android:textSize="18sp" android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" + android:drawablePadding="4dip" /> </LinearLayout> diff --git a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml index d8bea56..6e8a645 100644 --- a/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml +++ b/core/res/res/layout/keyguard_screen_sim_pin_portrait.xml @@ -111,7 +111,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@android:drawable/ic_emergency" - android:drawablePadding="8dip" + android:drawablePadding="4dip" android:text="@android:string/lockscreen_emergency_call" /> </LinearLayout> diff --git a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml index 11a6e12..b662e82 100644 --- a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml +++ b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml @@ -175,7 +175,7 @@ android:layout_marginLeft="8dip" android:textSize="18sp" android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" + android:drawablePadding="4dip" /> </LinearLayout> diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml index 0368530..4349c5b 100644 --- a/core/res/res/layout/keyguard_screen_tab_unlock.xml +++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml @@ -29,7 +29,8 @@ android:gravity="center_horizontal"> <com.android.internal.widget.DigitalClock android:id="@+id/time" - android:layout_marginBottom="18dip" + android:layout_marginTop="@dimen/keyguard_lockscreen_status_line_clockfont_top_margin" + android:layout_marginBottom="12dip" android:layout_marginRight="@dimen/keyguard_lockscreen_status_line_font_right_margin" android:layout_gravity="right"> @@ -149,7 +150,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" - android:layout_marginBottom="8dip" + android:layout_marginBottom="12dip" android:gravity="center_horizontal" android:singleLine="true" android:ellipsize="marquee" diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml index 2849376..294f91e 100644 --- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml +++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml @@ -104,6 +104,7 @@ android:id="@+id/carrier" android:layout_width="0dip" android:layout_gravity="fill_horizontal" + android:layout_marginBottom="12dip" android:gravity="right" android:singleLine="true" android:ellipsize="marquee" diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml index 64c479f..03fc79e 100644 --- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml +++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml @@ -28,7 +28,8 @@ android:gravity="center_horizontal"> <com.android.internal.widget.DigitalClock android:id="@+id/time" - android:layout_marginBottom="18dip" + android:layout_marginTop="@dimen/keyguard_lockscreen_status_line_clockfont_top_margin" + android:layout_marginBottom="12dip" android:layout_marginRight="@dimen/keyguard_lockscreen_status_line_font_right_margin" android:layout_gravity="right"> @@ -171,4 +172,19 @@ android:layout_height="0dip" /> + <!-- Area to overlay FaceLock --> + <TextView android:id="@+id/faceLockAreaView" + android:visibility="gone" + android:layout_row="4" + android:layout_column="0" + android:layout_rowSpan="1" + android:layout_columnSpan="1" + android:layout_gravity="fill" + android:layout_marginTop="8dip" + android:layout_marginBottom="8dip" + android:layout_width="0dip" + android:layout_height="0dip" + android:background="@color/facelock_color_background" + /> + </GridLayout> diff --git a/core/res/res/layout/volume_adjust.xml b/core/res/res/layout/volume_adjust.xml index ea4e1f9..c16a12c 100644 --- a/core/res/res/layout/volume_adjust.xml +++ b/core/res/res/layout/volume_adjust.xml @@ -21,7 +21,6 @@ android:id="@+id/visible_panel" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="80dp" android:background="@android:drawable/dialog_full_holo_dark" android:orientation="horizontal" > diff --git a/core/res/res/layout/webview_find.xml b/core/res/res/layout/webview_find.xml index 4cf2df5..a628ac8 100644 --- a/core/res/res/layout/webview_find.xml +++ b/core/res/res/layout/webview_find.xml @@ -26,7 +26,7 @@ android:scrollHorizontally="true" android:inputType="text" android:hint="@string/find_on_page" - android:imeOptions="actionDone" + android:imeOptions="actionDone|flagNoExtractUi|flagNoFullscreen" android:layout_marginRight="10dip" /> <TextView android:id="@+id/matches" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 979ab84..dfd8ff8 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1109,9 +1109,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Ontdoen die uitvee."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Doen vir eers niks."</string> <string name="choose_account_label" msgid="4191313562041125787">"Kies \'n rekening"</string> - <string name="add_account_label" msgid="2935267344849993553">"Voeg \'n rekening by"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Watter rekening wil jy gebruik?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Voeg rekening by"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Verhoging"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Verminder"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tik en hou."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index cdc2027..ddb1baf 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -62,7 +62,7 @@ <string name="RuacMmi" msgid="7827887459138308886">"የሚያበሳጭ የማይፈለጉ ጥሪዎች አለመቀበል።"</string> <string name="CndMmi" msgid="3116446237081575808">"መደወያ ቁጥር አስረከበ"</string> <string name="DndMmi" msgid="1265478932418334331">"አትረብሽ"</string> - <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች። ቀጥሎ ጥሪ፡ ተከልክሏል"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች።ቀጥሎ ጥሪ፡ ተከልክሏል"</string> <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች።ቀጥሎ ጥሪ፡ አልተከለከለም"</string> <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"የደዋይ ID ወደ አልተከለከለም ነባሪዎች።ቀጥሎ ጥሪ፡ ተከልክሏል"</string> <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"የደዋይ ID ነባሪዎች ወደአልተከለከለም። ቀጥሎ ጥሪ፡አልተከለከለም"</string> @@ -221,7 +221,7 @@ <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"ትግበራ ምንም እንኳ ማህደረ ትውስታ አነስተኛ ባይሆንም ሌላ ትግበራዎች የዳራ ሂደታቸውን ለማቆም ይፈቅዳል።"</string> <string name="permlab_forceStopPackages" msgid="1447830113260156236">"ሌላ ትግበራዎችን በኃይል አቁም"</string> <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"ትግበራ ሌሎች ትግበራዎችን በኃይል ለማስቆም ይፈቅዳል።"</string> - <string name="permlab_forceBack" msgid="1804196839880393631">"ትግበራ እንዲዘጋ አስገድድ"</string> + <string name="permlab_forceBack" msgid="1804196839880393631">"ትግበራ እንዲዘጋአስገድድ"</string> <string name="permdesc_forceBack" msgid="6534109744159919013">"ትግበራ ማንኛውም ቅድመገፅ እንቅስቃሴ በግድ ለመዝጋት እና ለመመለስ ይፈቅዳል። ለመደበኛ ትግበራዎች በፍፁም አያስፈልግም።"</string> <string name="permlab_dump" msgid="1681799862438954752">"የስርዓት የውስጥ ሁኔታን ሰርስረህ አውጣ"</string> <string name="permdesc_dump" msgid="2198776174276275220">"ትግበራ የስረዓት ውስጣዊ ሁኔታ ሰርስረው ሊያወጡ ይፈቅዳል። ተንኮል አዘል ትግበራዎች በፍፁም የማያስፈልጋቸውን የተለያዩ ሰፋ ያለ የግል እና የተጠበቀ መረጃ ሰርስረ ው ሊያወጡይችላሉ።"</string> @@ -841,7 +841,7 @@ <string name="years" msgid="6881577717993213522">"ዓመታት"</string> <string name="VideoView_error_title" msgid="3359437293118172396">"ቪዲዮ ማጫወት አልተቻለም።"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="897920883624437033">"ይቅርታ፣ ይህ ቪዲዮ በዚህ መሣሪያ ለመልቀቅ ትክክል አይደለም።"</string> - <string name="VideoView_error_text_unknown" msgid="710301040038083944">"ይቅርታ፣ ይህ ቪዲዮ መጫወት አልቻለም።"</string> + <string name="VideoView_error_text_unknown" msgid="710301040038083944">"ይቅርታ፣ ይህ ቪዲዮመጫወት አልቻለም።"</string> <string name="VideoView_error_button" msgid="2822238215100679592">"እሺ"</string> <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="noon" msgid="7245353528818587908">"ቀትር"</string> @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"የURL ቅጂ"</string> <string name="selectTextMode" msgid="6738556348861347240">"ፅሁፍ ምረጥ"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"የፅሁፍ ምርጫ"</string> - <string name="addToDictionary" msgid="9090375111134433012">"ወደ መዝገበ ቃላት አክል"</string> - <string name="deleteText" msgid="7070985395199629156">"ሰርዝ"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"ግቤት ሜተድ"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"የፅሁፍ እርምጃዎች"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"ቦታ አንሷል"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"ስርዞቹን ቀልብስ።"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"ለአሁን ምንም አታድርግ።"</string> <string name="choose_account_label" msgid="4191313562041125787">"መለያ ምረጥ"</string> - <string name="add_account_label" msgid="2935267344849993553">"መለያ አክል"</string> - <string name="choose_account_text" msgid="6891230675141555481">"የትኛውን መለያ መጠቀም ትፈልጋለህ?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"መለያ አክል"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"ጨምር"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"ቀንስ"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> አንዴ ንካ እና ያዝ"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"የUSB ማከማቻ"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"አርትእ..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"የውሂብ አጠቃቀም ማስጠንቀቂየ"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"ቅንብሮችን እና አጠቃቀምን ለማየት ንካ"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G ውሂብ ቦዝኗል"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G ውሂብ ቦዝኗል"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"የተንቀሳቃሽ ውሂብ ቦዝኗል"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 00c1ec1..0386ab4 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"نسخ عنوان URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"تحديد نص..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"تحديد النص"</string> - <string name="addToDictionary" msgid="9090375111134433012">"إضافة إلى القاموس"</string> - <string name="deleteText" msgid="7070985395199629156">"حذف"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"المساحة منخفضة"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"التراجع عن عمليات الحذف"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"عدم تنفيذ أي شيء الآن"</string> <string name="choose_account_label" msgid="4191313562041125787">"حدد حسابًا."</string> - <string name="add_account_label" msgid="2935267344849993553">"إضافة حساب"</string> - <string name="choose_account_text" msgid="6891230675141555481">"ما الحساب الذي تريد استخدامه؟"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"إضافة حساب"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"زيادة"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"تناقص"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> انقر مع الاستمرار."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"وحدة تخزين USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"تعديل..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"تحذير استخدام البيانات"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"المس لعرض الاستخدام والإعدادات"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"تم تعطيل بيانات شبكات الجيل الثاني والجيل الثالث"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"تم تعطيل بيانات شبكة الجيل الرابع"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"تم تعطيل بيانات الجوال"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 4470d47..c55322b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Копиране на URL адреса"</string> <string name="selectTextMode" msgid="6738556348861347240">"Избиране на текст..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Избиране на текст"</string> - <string name="addToDictionary" msgid="9090375111134433012">"добавяне към речника"</string> - <string name="deleteText" msgid="7070985395199629156">"изтриване"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мястото не достига"</string> @@ -1164,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB хранилище"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Редактиране..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Предупрежд. за ползване на данни"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Ползване и настройки: Докоснете"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G данните са деактивирани"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G данните са деактивирани"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобилните данни са деактивирани"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 83eec4a..1ee5c74 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1109,9 +1109,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Desfés les supressions."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"No facis res de moment."</string> <string name="choose_account_label" msgid="4191313562041125787">"Selecciona un compte"</string> - <string name="add_account_label" msgid="2935267344849993553">"Addició d\'un compte"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Quin compte vols fer servir?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Afegeix un compte"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementa"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminueix"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> mantén premut."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 45b0255..2190b7e 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopírovat adresu URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Vybrat text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Výběr textu"</string> - <string name="addToDictionary" msgid="9090375111134433012">"přidat do slovníku"</string> - <string name="deleteText" msgid="7070985395199629156">"smazat"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Metoda zadávání dat"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Operace s textem"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Málo paměti"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátit mazání zpět."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Neprovádět akci."</string> <string name="choose_account_label" msgid="4191313562041125787">"Vybrat účet"</string> - <string name="add_account_label" msgid="2935267344849993553">"Přidat účet"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Který účet chcete použít?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Přidat účet"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšení"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Snížení"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – Klepněte a podržte."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Úložiště USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Upravit..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornění na využití dat"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Dotykem zobraz. využití a nast."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datové přenosy 2G a 3G zakázány"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datové přenosy 4G jsou zakázány"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilní data jsou zakázána"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 6d798e4..f5a9846 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopier webadresse"</string> <string name="selectTextMode" msgid="6738556348861347240">"Marker tekst..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstmarkering"</string> - <string name="addToDictionary" msgid="9090375111134433012">"føj til ordbog"</string> - <string name="deleteText" msgid="7070985395199629156">"slet"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Inputmetode"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Der er ikke så meget plads tilbage"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Fortryd sletningerne."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Gør ikke noget lige nu."</string> <string name="choose_account_label" msgid="4191313562041125787">"Vælg en konto"</string> - <string name="add_account_label" msgid="2935267344849993553">"Tilføj en konto"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Hvilken konto vil du bruge?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Tilføj konto"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Optælling"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Nedtælling"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tryk og hold <xliff:g id="VALUE">%s</xliff:g> nede."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-lager"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Rediger..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel om dataforbrug"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Tryk for at få vist brug og indstillinger"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G-data er deaktiveret"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-data er deaktiveret"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata er deaktiveret"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index c883905..d376fd9 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URL kopieren"</string> <string name="selectTextMode" msgid="6738556348861347240">"Text auswählen..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Textauswahl"</string> - <string name="addToDictionary" msgid="9090375111134433012">"Zum Wörterbuch hinzufügen"</string> - <string name="deleteText" msgid="7070985395199629156">"Löschen"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Eingabemethode"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Textaktionen"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Geringer Speicher"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Löschen rückgängig machen"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Im Moment nichts unternehmen"</string> <string name="choose_account_label" msgid="4191313562041125787">"Konto auswählen"</string> - <string name="add_account_label" msgid="2935267344849993553">"Konto hinzufügen"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Welches Konto möchten Sie verwenden?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Konto hinzufügen"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Erhöhen"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Verringern"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tippen und halten"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-Speicher"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Bearbeiten..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Warnung zu Datennutzung"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Für Nutzung/Einstellungen berühren"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-Daten deaktiviert"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-Daten deaktiviert"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobile Daten deaktiviert"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5c84e49..601a054 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Αντιγραφή διεύθυνσης URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Επιλογή κειμένου..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Επιλογή κειμένου"</string> - <string name="addToDictionary" msgid="9090375111134433012">"προσθήκη στο λεξικό"</string> - <string name="deleteText" msgid="7070985395199629156">"διαγραφή"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Μέθοδος εισόδου"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Ενέργειες κειμένου"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Απομένει λίγος ελεύθερος χώρος"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Αναίρεση των διαγραφών."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Να μην γίνει καμία ενέργεια τώρα."</string> <string name="choose_account_label" msgid="4191313562041125787">"Επιλογή λογαριασμού"</string> - <string name="add_account_label" msgid="2935267344849993553">"Προσθήκη λογαριασμού"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Ποιον λογαριασμό θέλετε να χρησιμοποιήσετε;"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Προσθήκη λογαριασμού"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Αύξηση"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Μείωση"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Πατήστε και κρατήστε πατημένο το <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Χώρος αποθήκευσης USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Επεξεργασία..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Προειδοποίηση χρήσης δεδομένων"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Αγγ.για προβ.της χρ.και των ρυθ."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Τα δεδ. 2G-3G απενεργοποιήθηκαν"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Τα δεδομένα 4G απενεργοποιήθηκαν"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Τα δεδομ. κιν. τηλεφ. απενεργοπ."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 19d60ea..82e97e0 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1109,9 +1109,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Undo the deletions."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Do nothing for now."</string> <string name="choose_account_label" msgid="4191313562041125787">"Select an account"</string> - <string name="add_account_label" msgid="2935267344849993553">"Add an account"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Which taxonomy would you like to use?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Add account"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Increment"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tap and hold."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 9c7cf79..721b0c7 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string> - <string name="addToDictionary" msgid="9090375111134433012">"Agregar al diccionario"</string> - <string name="deleteText" msgid="7070985395199629156">"Eliminar"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio de almacenamiento"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer eliminaciones."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"No hagas nada por el momento."</string> <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string> - <string name="add_account_label" msgid="2935267344849993553">"Agregar una cuenta"</string> - <string name="choose_account_text" msgid="6891230675141555481">"¿Qué cuenta deseas usar?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Agregar una cuenta"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decremento"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantenga presionado <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Toca para ver uso y config."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datos de 2 GB - 3 GB desactivados"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datos de 4 GB desactivados"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datos móviles desactivados"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 6a721d7..dc3a630 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string> - <string name="addToDictionary" msgid="9090375111134433012">"añadir al diccionario"</string> - <string name="deleteText" msgid="7070985395199629156">"eliminar"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Método de introducción de texto"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer las eliminaciones"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"No hacer nada por ahora"</string> <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string> - <string name="add_account_label" msgid="2935267344849993553">"Añadir una cuenta"</string> - <string name="choose_account_text" msgid="6891230675141555481">"¿Qué cuenta quieres usar?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Añadir cuenta"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminuir"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantén pulsado <xliff:g id="VALUE">%s</xliff:g>"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Advertencia de uso de datos"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Tocar para ver el uso y ajustes"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datos 2G-3G inhabilitados"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datos 4G inhabilitados"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datos móviles inhabilitados"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 886cb9a..d40c6d7 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"انتخاب متن..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"انتخاب متن"</string> - <string name="addToDictionary" msgid="9090375111134433012">"افزودن به فرهنگ لغت"</string> - <string name="deleteText" msgid="7070985395199629156">"حذف"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"عملکردهای متنی"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"فضا کم است"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"لغو موارد حذف شده."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"اکنون هیچ کاری انجام نشود."</string> <string name="choose_account_label" msgid="4191313562041125787">"انتخاب یک حساب"</string> - <string name="add_account_label" msgid="2935267344849993553">"افزودن یک حساب"</string> - <string name="choose_account_text" msgid="6891230675141555481">"از کدام حساب میخواهید استفاده کنید؟"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"افزودن حساب"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"افزایش"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"کاهش"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ضربه بزنید و نگه دارید."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"حافظه USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"ویرایش..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"هشدار میزان استفاده از داده"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"لمس برای مشاهده استفاده و تنظیمات"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"داده های 2G-3G غیرفعال شد"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"داده 4G غیر فعال شده است"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"داده های تلفن همراه غیرفعال شد"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 4845868..1462df4 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopioi URL-osoite"</string> <string name="selectTextMode" msgid="6738556348861347240">"Tekstin valinta..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstin valinta"</string> - <string name="addToDictionary" msgid="9090375111134433012">"lisää sanakirjaan"</string> - <string name="deleteText" msgid="7070985395199629156">"poista"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Syöttötapa"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoiminnot"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Tila vähissä"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Kumoa poistot."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Älä tee mitään."</string> <string name="choose_account_label" msgid="4191313562041125787">"Valitse tili"</string> - <string name="add_account_label" msgid="2935267344849993553">"Lisää tili"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Mitä tiliä haluaisit käyttää?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Lisää tili"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Lisää"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähennä"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> kosketa pitkään."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-tallennustila"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Muokkaa..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Tiedonsiirtovaroitus"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Näytä käyttö ja asetukset"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G-tiedonsiirto pois käytöstä"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-tiedonsiirto pois käytöstä"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobiilitiedonsiirto pois käytöstä"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 32cca9c..c5e692b 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copier l\'URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Sélect. le texte..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Sélection de texte"</string> - <string name="addToDictionary" msgid="9090375111134433012">"ajouter au dictionnaire"</string> - <string name="deleteText" msgid="7070985395199629156">"supprimer"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Espace disponible faible"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Annuler les suppressions"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Ne rien faire pour l\'instant"</string> <string name="choose_account_label" msgid="4191313562041125787">"Sélectionner un compte"</string> - <string name="add_account_label" msgid="2935267344849993553">"Ajouter un compte"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Quel compte souhaitez-vous utiliser ?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Ajouter un compte"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Augmenter"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuer"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> appuyez de manière prolongée."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Modifier..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Avertissement utilisation données"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Appuyez pour utilisation/param."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Données 2G-3G désactivées"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Données 4G désactivées"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Données mobiles désactivées"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 88c07c7..ab6eb93 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Odabir teksta..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Odabir teksta"</string> - <string name="addToDictionary" msgid="9090375111134433012">"dodaj u rječnik"</string> - <string name="deleteText" msgid="7070985395199629156">"izbriši"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje s tekstom"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Prostora ima sve manje"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Poništi brisanja."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Za sad nemoj ništa učiniti."</string> <string name="choose_account_label" msgid="4191313562041125787">"Odaberite račun"</string> - <string name="add_account_label" msgid="2935267344849993553">"Dodajte račun"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Koji račun želite upotrebljavati?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Povećaj"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Smanji"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotaknite i držite."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB pohrana"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Uređivanje..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Upozorenje o upotrebi podataka"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Dodirnite za pregled upotrebe i postavki"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G podaci su onemogućeni"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G podaci su onemogućeni"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilni podaci su onemogućeni"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 3aa348e..3e2ae7f 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URL másolása"</string> <string name="selectTextMode" msgid="6738556348861347240">"Szöveg kijelölése..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Szöveg kijelölése"</string> - <string name="addToDictionary" msgid="9090375111134433012">"hozzáadás a szótárhoz"</string> - <string name="deleteText" msgid="7070985395199629156">"törlés"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Beviteli mód"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Műveletek szöveggel"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Kevés a hely"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Törlés visszavonása."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Most nem."</string> <string name="choose_account_label" msgid="4191313562041125787">"Fiók kiválasztása"</string> - <string name="add_account_label" msgid="2935267344849993553">"Fiók hozzáadása"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Melyik alkalmazást szeretné használni?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Fiók hozzáadása"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Növelés"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Csökkentés"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> érintse meg és tartsa"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-tár"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Szerkesztés..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Adathasználati figyelmeztetés"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Érintse meg az adatokért"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G adatforgalom letiltva"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G adatforgalom letiltva"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil adatforgalom letiltva"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index cdcf600..aea1a4c 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string> - <string name="addToDictionary" msgid="9090375111134433012">"tambahkan ke kamus"</string> - <string name="deleteText" msgid="7070985395199629156">"hapus"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Metode masukan"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Ruang penyimpanan tinggal sedikit"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Urungkan penghapusan."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Jangan lakukan apa pun untuk saat ini."</string> <string name="choose_account_label" msgid="4191313562041125787">"Pilih akun"</string> - <string name="add_account_label" msgid="2935267344849993553">"Tambahkan akun"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Akun mana yang ingin Anda gunakan?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Penambahan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Pengurangan"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketuk dan tahan."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Penyimpanan USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Edit..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Peringatan penggunaan data"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Sentuh utk mlht pnggnaan dan stln"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data 2G-3G dinonaktifkan"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data 4G dinonaktifkan"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Data seluler dinonaktifkan"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6e9c9d0..419caf4 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1109,9 +1109,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Annulla le eliminazioni."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Non fare nulla per ora."</string> <string name="choose_account_label" msgid="4191313562041125787">"Seleziona un account"</string> - <string name="add_account_label" msgid="2935267344849993553">"Aggiungi un account"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Quale account desideri utilizzare?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Aggiungi account"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumenta"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuisci"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tocca e tieni premuto il numero <xliff:g id="VALUE">%s</xliff:g>."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 181910c..c0c1695 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string> <string name="selectTextMode" msgid="6738556348861347240">"בחר טקסט..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string> - <string name="addToDictionary" msgid="9090375111134433012">"הוסף למילון"</string> - <string name="deleteText" msgid="7070985395199629156">"מחק"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"חסר שטח"</string> @@ -1164,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"אמצעי אחסון מסוג USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"ערוך..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"אזהרת שימוש בנתונים"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"גע כדי להציג נתוני שימוש והגדרות"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"נתוני 2G-3G מושבתים"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"נתוני 4G מושבתים"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"נתונים לנייד מושבתים"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index c4adc10..793e947 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URLをコピー"</string> <string name="selectTextMode" msgid="6738556348861347240">"テキストを選択..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"テキスト選択"</string> - <string name="addToDictionary" msgid="9090375111134433012">"辞書に追加"</string> - <string name="deleteText" msgid="7070985395199629156">"削除"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"入力方法"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"テキスト操作"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"空き容量低下"</string> @@ -1164,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USBストレージ"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"編集..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"データ使用の警告"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"タップして使用状況と設定を表示"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G~3Gデータが無効になりました"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4Gデータが無効になりました"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"モバイルデータが無効になりました"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 7472f9d..42a6e37 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URL 복사"</string> <string name="selectTextMode" msgid="6738556348861347240">"텍스트 선택..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"텍스트 선택"</string> - <string name="addToDictionary" msgid="9090375111134433012">"사전에 추가"</string> - <string name="deleteText" msgid="7070985395199629156">"삭제"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"입력 방법"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"텍스트 작업"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"저장공간 부족"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"삭제 실행취소"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"나중에 작업"</string> <string name="choose_account_label" msgid="4191313562041125787">"계정 선택"</string> - <string name="add_account_label" msgid="2935267344849993553">"계정 추가"</string> - <string name="choose_account_text" msgid="6891230675141555481">"어떤 계정을 사용하시겠습니까?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"계정 추가"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"올리기"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"줄이기"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 길게 탭하세요."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB 저장소"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"수정..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"데이터 사용 경고"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"사용량 및 설정을 보려면 터치하세요."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G 데이터 사용중지됨"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G 데이터 사용중지됨"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"모바일 데이터 사용중지됨"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 2924735..3a30114 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopijuoti URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Pasirinkti tekstą..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksto pasirinkimas"</string> - <string name="addToDictionary" msgid="9090375111134433012">"pridėti prie žodyno"</string> - <string name="deleteText" msgid="7070985395199629156">"ištrinti"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Įvesties būdas"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mažai vietos"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Anuliuoti ištrynimus."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Kol kas nieko nedaryti."</string> <string name="choose_account_label" msgid="4191313562041125787">"Pasirinkti paskyrą"</string> - <string name="add_account_label" msgid="2935267344849993553">"Pridėti paskyrą"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Kurią paskyrą norite naudoti?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Pridėti paskyrą"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Padidinti"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Sumažinti"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Palieskite <xliff:g id="VALUE">%s</xliff:g> ir laikykite palietę."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB atmintis"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Redaguoti..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Įspėjimas dėl duomenų naudojimo"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Paliesk., kad žr. naud. ir nust."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G duomenys neleidžiami"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G duomenys neleidžiami"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilieji duomenys neleidžiami"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 1fc5c63..e9a01e9 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopēt URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Atlasīt tekstu..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksta atlase"</string> - <string name="addToDictionary" msgid="9090375111134433012">"pievienot vārdnīcai"</string> - <string name="deleteText" msgid="7070985395199629156">"dzēst"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Ievades metode"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksta darbības"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Maz brīvas vietas"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Atsauciet dzēšanu."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Pagaidām neveiciet nekādas darbības."</string> <string name="choose_account_label" msgid="4191313562041125787">"Atlasīt kontu"</string> - <string name="add_account_label" msgid="2935267344849993553">"Pievienot kontu"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Kuru kontu vēlaties izmantot?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Pievienot kontu"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Palielināt"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Samazināt"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g>: pieskarieties un turiet nospiestu."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB atmiņa"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Rediģēt..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Datu izmantošanas brīdinājums"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Piesk., lai sk. lietoš. un iest."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G dati ir atspējoti"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G dati ir atspējoti"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilie dati ir atspējoti"</string> diff --git a/core/res/res/values-mcc204-cs/strings.xml b/core/res/res/values-mcc204-cs/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-da/strings.xml b/core/res/res/values-mcc204-da/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-de/strings.xml b/core/res/res/values-mcc204-de/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-el/strings.xml b/core/res/res/values-mcc204-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc204-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc204-es-rUS/strings.xml b/core/res/res/values-mcc204-es-rUS/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-es/strings.xml b/core/res/res/values-mcc204-es/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-fr/strings.xml b/core/res/res/values-mcc204-fr/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-it/strings.xml b/core/res/res/values-mcc204-it/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-ja/strings.xml b/core/res/res/values-mcc204-ja/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-ko/strings.xml b/core/res/res/values-mcc204-ko/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-nl/strings.xml b/core/res/res/values-mcc204-nl/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-pl/strings.xml b/core/res/res/values-mcc204-pl/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-pt-rPT/strings.xml b/core/res/res/values-mcc204-pt-rPT/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-pt/strings.xml b/core/res/res/values-mcc204-pt/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-ru/strings.xml b/core/res/res/values-mcc204-ru/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-sv/strings.xml b/core/res/res/values-mcc204-sv/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-tr/strings.xml b/core/res/res/values-mcc204-tr/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-zh-rCN/strings.xml b/core/res/res/values-mcc204-zh-rCN/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc204-zh-rTW/strings.xml b/core/res/res/values-mcc204-zh-rTW/strings.xml new file mode 100644 index 0000000..7d96230 --- /dev/null +++ b/core/res/res/values-mcc204-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"nl_nl"</string> +</resources> diff --git a/core/res/res/values-mcc230-cs/strings.xml b/core/res/res/values-mcc230-cs/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-da/strings.xml b/core/res/res/values-mcc230-da/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-de/strings.xml b/core/res/res/values-mcc230-de/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-el/strings.xml b/core/res/res/values-mcc230-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc230-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc230-es-rUS/strings.xml b/core/res/res/values-mcc230-es-rUS/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-es/strings.xml b/core/res/res/values-mcc230-es/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-fr/strings.xml b/core/res/res/values-mcc230-fr/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-it/strings.xml b/core/res/res/values-mcc230-it/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-ja/strings.xml b/core/res/res/values-mcc230-ja/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-ko/strings.xml b/core/res/res/values-mcc230-ko/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-nl/strings.xml b/core/res/res/values-mcc230-nl/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-pl/strings.xml b/core/res/res/values-mcc230-pl/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-pt-rPT/strings.xml b/core/res/res/values-mcc230-pt-rPT/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-pt/strings.xml b/core/res/res/values-mcc230-pt/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-ru/strings.xml b/core/res/res/values-mcc230-ru/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-sv/strings.xml b/core/res/res/values-mcc230-sv/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-tr/strings.xml b/core/res/res/values-mcc230-tr/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-zh-rCN/strings.xml b/core/res/res/values-mcc230-zh-rCN/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc230-zh-rTW/strings.xml b/core/res/res/values-mcc230-zh-rTW/strings.xml new file mode 100644 index 0000000..d3ecdbb --- /dev/null +++ b/core/res/res/values-mcc230-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"cs_cz"</string> +</resources> diff --git a/core/res/res/values-mcc232-cs/strings.xml b/core/res/res/values-mcc232-cs/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-da/strings.xml b/core/res/res/values-mcc232-da/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-de/strings.xml b/core/res/res/values-mcc232-de/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-el/strings.xml b/core/res/res/values-mcc232-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc232-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc232-es-rUS/strings.xml b/core/res/res/values-mcc232-es-rUS/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-es/strings.xml b/core/res/res/values-mcc232-es/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-fr/strings.xml b/core/res/res/values-mcc232-fr/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-it/strings.xml b/core/res/res/values-mcc232-it/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-ja/strings.xml b/core/res/res/values-mcc232-ja/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-ko/strings.xml b/core/res/res/values-mcc232-ko/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-nl/strings.xml b/core/res/res/values-mcc232-nl/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-pl/strings.xml b/core/res/res/values-mcc232-pl/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-pt-rPT/strings.xml b/core/res/res/values-mcc232-pt-rPT/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-pt/strings.xml b/core/res/res/values-mcc232-pt/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-ru/strings.xml b/core/res/res/values-mcc232-ru/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-sv/strings.xml b/core/res/res/values-mcc232-sv/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-tr/strings.xml b/core/res/res/values-mcc232-tr/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-zh-rCN/strings.xml b/core/res/res/values-mcc232-zh-rCN/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc232-zh-rTW/strings.xml b/core/res/res/values-mcc232-zh-rTW/strings.xml new file mode 100644 index 0000000..4773838 --- /dev/null +++ b/core/res/res/values-mcc232-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_at"</string> +</resources> diff --git a/core/res/res/values-mcc234-cs/strings.xml b/core/res/res/values-mcc234-cs/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-da/strings.xml b/core/res/res/values-mcc234-da/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-de/strings.xml b/core/res/res/values-mcc234-de/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-el/strings.xml b/core/res/res/values-mcc234-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc234-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc234-es-rUS/strings.xml b/core/res/res/values-mcc234-es-rUS/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-es/strings.xml b/core/res/res/values-mcc234-es/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-fr/strings.xml b/core/res/res/values-mcc234-fr/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-it/strings.xml b/core/res/res/values-mcc234-it/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-ja/strings.xml b/core/res/res/values-mcc234-ja/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-ko/strings.xml b/core/res/res/values-mcc234-ko/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-nl/strings.xml b/core/res/res/values-mcc234-nl/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-pl/strings.xml b/core/res/res/values-mcc234-pl/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-pt-rPT/strings.xml b/core/res/res/values-mcc234-pt-rPT/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-pt/strings.xml b/core/res/res/values-mcc234-pt/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-ru/strings.xml b/core/res/res/values-mcc234-ru/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-sv/strings.xml b/core/res/res/values-mcc234-sv/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-tr/strings.xml b/core/res/res/values-mcc234-tr/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-zh-rCN/strings.xml b/core/res/res/values-mcc234-zh-rCN/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc234-zh-rTW/strings.xml b/core/res/res/values-mcc234-zh-rTW/strings.xml new file mode 100644 index 0000000..2538b73 --- /dev/null +++ b/core/res/res/values-mcc234-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"en_gb"</string> +</resources> diff --git a/core/res/res/values-mcc260-cs/strings.xml b/core/res/res/values-mcc260-cs/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-da/strings.xml b/core/res/res/values-mcc260-da/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-de/strings.xml b/core/res/res/values-mcc260-de/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-el/strings.xml b/core/res/res/values-mcc260-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc260-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc260-es-rUS/strings.xml b/core/res/res/values-mcc260-es-rUS/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-es/strings.xml b/core/res/res/values-mcc260-es/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-fr/strings.xml b/core/res/res/values-mcc260-fr/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-it/strings.xml b/core/res/res/values-mcc260-it/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-ja/strings.xml b/core/res/res/values-mcc260-ja/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-ko/strings.xml b/core/res/res/values-mcc260-ko/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-nl/strings.xml b/core/res/res/values-mcc260-nl/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-pl/strings.xml b/core/res/res/values-mcc260-pl/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-pt-rPT/strings.xml b/core/res/res/values-mcc260-pt-rPT/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-pt/strings.xml b/core/res/res/values-mcc260-pt/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-ru/strings.xml b/core/res/res/values-mcc260-ru/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-sv/strings.xml b/core/res/res/values-mcc260-sv/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-tr/strings.xml b/core/res/res/values-mcc260-tr/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-zh-rCN/strings.xml b/core/res/res/values-mcc260-zh-rCN/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc260-zh-rTW/strings.xml b/core/res/res/values-mcc260-zh-rTW/strings.xml new file mode 100644 index 0000000..1161f9a --- /dev/null +++ b/core/res/res/values-mcc260-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"pl_pl"</string> +</resources> diff --git a/core/res/res/values-mcc262-cs/strings.xml b/core/res/res/values-mcc262-cs/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-da/strings.xml b/core/res/res/values-mcc262-da/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-de/strings.xml b/core/res/res/values-mcc262-de/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-el/strings.xml b/core/res/res/values-mcc262-el/strings.xml new file mode 100644 index 0000000..97bfe65 --- /dev/null +++ b/core/res/res/values-mcc262-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"el_GR"</string> +</resources> diff --git a/core/res/res/values-mcc262-es-rUS/strings.xml b/core/res/res/values-mcc262-es-rUS/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-es-rUS/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-es/strings.xml b/core/res/res/values-mcc262-es/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-fr/strings.xml b/core/res/res/values-mcc262-fr/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-it/strings.xml b/core/res/res/values-mcc262-it/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-ja/strings.xml b/core/res/res/values-mcc262-ja/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-ko/strings.xml b/core/res/res/values-mcc262-ko/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-nl/strings.xml b/core/res/res/values-mcc262-nl/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-pl/strings.xml b/core/res/res/values-mcc262-pl/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-pt-rPT/strings.xml b/core/res/res/values-mcc262-pt-rPT/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-pt/strings.xml b/core/res/res/values-mcc262-pt/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-pt/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-ru/strings.xml b/core/res/res/values-mcc262-ru/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-sv/strings.xml b/core/res/res/values-mcc262-sv/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-sv/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-tr/strings.xml b/core/res/res/values-mcc262-tr/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-zh-rCN/strings.xml b/core/res/res/values-mcc262-zh-rCN/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-mcc262-zh-rTW/strings.xml b/core/res/res/values-mcc262-zh-rTW/strings.xml new file mode 100644 index 0000000..9505cf4 --- /dev/null +++ b/core/res/res/values-mcc262-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- 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. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="locale_replacement">"de_de"</string> +</resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 16bccb2..bdb43ee 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1113,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Buat asal pemadaman."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Jangan lakukan apa-apa sekarang."</string> <string name="choose_account_label" msgid="4191313562041125787">"Pilih akaun"</string> - <string name="add_account_label" msgid="2935267344849993553">"Tambah akaun"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Akaun mana yang anda ingin gunakan?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Tambah akaun"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Kenaikan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Penyusutan"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketik dan tahan."</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index f01bedc..e879f9b 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopier URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Marker tekst"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Merket tekst"</string> - <string name="addToDictionary" msgid="9090375111134433012">"legg til i ordliste"</string> - <string name="deleteText" msgid="7070985395199629156">"slett"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Inndatametode"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Lite plass"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Opphev slettinger."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Ikke gjør noe nå."</string> <string name="choose_account_label" msgid="4191313562041125787">"Velg en konto"</string> - <string name="add_account_label" msgid="2935267344849993553">"Legg til en konto"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Hvilken konto vil du bruke?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Legg til konto"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Øke"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Senke"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> trykk og hold inne."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Rediger"</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Advarsel for høyt dataforbruk"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Berør for å se bruk og innst."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G–3G-data er deaktivert"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-data er deaktivert"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata er deaktivert"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 0fbe538..5d22f64 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URL kopiëren"</string> <string name="selectTextMode" msgid="6738556348861347240">"Tekst selecteren..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstselectie"</string> - <string name="addToDictionary" msgid="9090375111134433012">"toevoegen aan woordenboek"</string> - <string name="deleteText" msgid="7070985395199629156">"verwijderen"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Invoermethode"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstacties"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Weinig ruimte"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Verwijderingen ongedaan maken."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Nu niets doen."</string> <string name="choose_account_label" msgid="4191313562041125787">"Selecteer een account"</string> - <string name="add_account_label" msgid="2935267344849993553">"Een account toevoegen"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Welk account wilt u gebruiken?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Account toevoegen"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Hoger"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Lager"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tik <xliff:g id="VALUE">%s</xliff:g> keer en blijf aanraken."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-opslag"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Bewerken..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Waarschuwing v. gegevensgebruik"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Aanraken: gebruik/inst. bekijken"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-gegevens uitgeschakeld"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-gegevens uitgeschakeld"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobiele gegevens uitgeschakeld"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d2cf3e5..56553cd 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopiuj adres URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Zaznacz tekst"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Zaznaczanie tekstu"</string> - <string name="addToDictionary" msgid="9090375111134433012">"dodaj do słownika"</string> - <string name="deleteText" msgid="7070985395199629156">"usuń"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Sposób wprowadzania tekstu"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Działania na tekście"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mało miejsca"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Cofnij usunięcie."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Nie wykonuj teraz żadnych czynności."</string> <string name="choose_account_label" msgid="4191313562041125787">"Wybierz konto"</string> - <string name="add_account_label" msgid="2935267344849993553">"Dodaj konto"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Którego konta chcesz użyć?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj konto"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zwiększ"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmniejsz"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotknij i przytrzymaj."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Nośnik USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Edytuj..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Ostrzeżenie o transmisji danych"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Zobacz wykorzystanie i ustawienia"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Wyłączono transmisję danych 2G/3G"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Wyłączono transmisję danych 4G"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Wyłączono komórkową transm. danych"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 962405b..e60a3c8 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecção de texto"</string> - <string name="addToDictionary" msgid="9090375111134433012">"adicionar ao dicionário"</string> - <string name="deleteText" msgid="7070985395199629156">"eliminar"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Acções de texto"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço livre"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Anular as eliminações."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por agora."</string> <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar conta"</string> - <string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Que conta gostaria de utilizar?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuir"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Toque sem soltar em <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso de utilização de dados"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Toque para ver a utilização e as definições"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Os dados 2G-3G estão desativados"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Os dados 4G estão desativados"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Os dados móveis estão desativados"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 9dc7098..de8266b 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Selecionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Seleção de texto"</string> - <string name="addToDictionary" msgid="9090375111134433012">"adicionar ao dicionário"</string> - <string name="deleteText" msgid="7070985395199629156">"excluir"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Ações de texto"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Desfazer as exclusões."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por enquanto."</string> <string name="choose_account_label" msgid="4191313562041125787">"Selecione uma conta"</string> - <string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Que conta você gostaria de usar?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Redução"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> toque e mantenha pressionado."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Editar..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Aviso sobre uso de dados"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Tocar p/ ver uso e configurações"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Dados 2G e 3G desativados"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Dados 4G desativados"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Dados móveis desativados"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index ff0f310..c538450 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Copiaţi adresa URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Selectaţi text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selectare text"</string> - <string name="addToDictionary" msgid="9090375111134433012">"adăugaţi în dicţionar"</string> - <string name="deleteText" msgid="7070985395199629156">"ştergeţi"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Metodă de intrare"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Acţiuni pentru text"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Spaţiu de stocare redus"</string> @@ -1164,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Dsipozitiv de stocare USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Editaţi..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Avertisment de utiliz. a datelor"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Ating. pt. afiş. utiliz./setări"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Datele 2G-3G au fost dezactivate"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Datele 4G au fost dezactivate"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Datele mobile au fost dezactiv."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index da95360..2ca256f 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Копировать URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Выбрать текст..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Выбор текста"</string> - <string name="addToDictionary" msgid="9090375111134433012">"добавить в словарь"</string> - <string name="deleteText" msgid="7070985395199629156">"удалить"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Способ ввода"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Операции с текстом"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недостаточно места"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Отменить удаления."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Ничего не делать сейчас."</string> <string name="choose_account_label" msgid="4191313562041125787">"Выберите аккаунт"</string> - <string name="add_account_label" msgid="2935267344849993553">"Добавить аккаунт"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Какой аккаунт хотите использовать?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Добавить аккаунт"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличить"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Уменьшить"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Нажмите и удерживайте <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-накопитель"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Изменить..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Осталось мало трафика"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Проверить трафик и настройки"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Передача данных 2G/3G отключена"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Передача данных 4G отключена"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобильный Интернет отключен"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 2e9d2c3..9cf846f 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Skopírovať adresu URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Vybrať text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Výber textu"</string> - <string name="addToDictionary" msgid="9090375111134433012">"pridať do slovníka"</string> - <string name="deleteText" msgid="7070985395199629156">"odstrániť"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Metóda vstupu"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Operácie s textom"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nedostatok pamäte"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátiť späť odstránenia."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Nevykonať akciu."</string> <string name="choose_account_label" msgid="4191313562041125787">"Vybrať účet"</string> - <string name="add_account_label" msgid="2935267344849993553">"Pridať účet"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Ktorý účet chcete použiť?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Pridať účet"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšenie"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zníženie"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Klepnite a podržte <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Ukladací priestor USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Upraviť..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Upozornenie o využití dát"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Zobr. využívania dát a nastavení"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Dátové prenosy 2G a 3G zakázané"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Dátové prenosy 4G zakázané"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilné dátové prenosy zakázané"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index fdd0bd5..5aa1448 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Izbiranje besedila ..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Izbrano besedilo"</string> - <string name="addToDictionary" msgid="9090375111134433012">"dodaj v slovar"</string> - <string name="deleteText" msgid="7070985395199629156">"izbriši"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Način vnosa"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Besedilna dejanja"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Zmanjkuje pomnilnika"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Razveljavi brisanje."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Zaenkrat ne naredi ničesar."</string> <string name="choose_account_label" msgid="4191313562041125787">"Izberite račun"</string> - <string name="add_account_label" msgid="2935267344849993553">"Dodajanje računa"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Kateri račun želite uporabiti?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Povečaj"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmanjšaj"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tapnite in pridržite <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Pomnilnik USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Urejanje ..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Opozorilo o uporabi podatkov"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Dotik za prikaz uporabe in nast."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Podatki 2G-3G so onemogočeni"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Podatki 4G so onemogočeni"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobilni podatki so onemogočeni"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 1a1c3ed..f60e212 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Копирај URL адресу"</string> <string name="selectTextMode" msgid="6738556348861347240">"Изабери текст..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Избор текста"</string> - <string name="addToDictionary" msgid="9090375111134433012">"додај у речник"</string> - <string name="deleteText" msgid="7070985395199629156">"избриши"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мало простора"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Опозови брисања."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Не ради ништа за сада."</string> <string name="choose_account_label" msgid="4191313562041125787">"Избор налога"</string> - <string name="add_account_label" msgid="2935267344849993553">"Додавање налога"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Који налог желите да користите?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Додај налог"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Повећање"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Смањење"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> додирните и задржите."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB меморија"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Измени..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Упозорење о потрошњи података"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Додир за коришћење и подешавања"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G подаци су онемогућени"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G подаци су онемогућени"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Подаци мобилне мреже су онемогућени"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 0e04ea9..9a42ff3 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopiera webbadress"</string> <string name="selectTextMode" msgid="6738556348861347240">"Markera text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Textmarkering"</string> - <string name="addToDictionary" msgid="9090375111134433012">"lägg till i ordlista"</string> - <string name="deleteText" msgid="7070985395199629156">"ta bort"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Indatametod"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Textåtgärder"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Dåligt med utrymme"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Ångra borttagningarna."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Gör ingenting just nu."</string> <string name="choose_account_label" msgid="4191313562041125787">"Välj ett konto"</string> - <string name="add_account_label" msgid="2935267344849993553">"Lägg till ett konto"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Vilket konto vill du använda?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Lägg till konto"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Öka"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Minska"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> knacka lätt och håll kvar."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Redigera..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Varning angående dataanvändning"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Tryck om du vill visa användning och inställningar"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data via 2G-3G har inaktiverats"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data via 4G har inaktiverats"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobildata har inaktiverats"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 133bd81..f0f90c6 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -49,7 +49,7 @@ <string name="invalidPuk" msgid="8761456210898036513">"Andika PUK ambayo ina urefu wa nambari 8 au zaidi."</string> <string name="needPuk" msgid="919668385956251611">"Kadi yako ya SIM imefungwa na PUK. Anika msimbo wa PUK ili kuifungua."</string> <string name="needPuk2" msgid="4526033371987193070">"Chapisha PUK2 ili kufungua kadi ya SIM."</string> - <string name="ClipMmi" msgid="6952821216480289285">"Kitambulisho cha Mpigaji wa Simu Inayoingia"</string> + <string name="ClipMmi" msgid="6952821216480289285">"ID ya Mpigaji simu Inayoingia"</string> <string name="ClirMmi" msgid="7784673673446833091">"ID ya Mpigaji simu Inayotoka nje"</string> <string name="CfMmi" msgid="5123218989141573515">"Kusambaza simu"</string> <string name="CwMmi" msgid="9129678056795016867">"Simu inasubiriwa"</string> @@ -63,7 +63,7 @@ <string name="CndMmi" msgid="3116446237081575808">"Uwasilishaji nambari ya kupiga simu"</string> <string name="DndMmi" msgid="1265478932418334331">"Usisumbue"</string> <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string> - <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string> <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo:Imezuiliwa"</string> <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string> <string name="serviceNotProvisioned" msgid="8614830180508686666">"Huduma haitathminiwi."</string> @@ -131,8 +131,8 @@ <string name="me" msgid="6545696007631404292">"Mimi"</string> <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Chaguo za kompyuta ndogo"</string> <string name="power_dialog" product="default" msgid="1319919075463988638">"Machaguo ya simu"</string> - <string name="silent_mode" msgid="7167703389802618663">"Hali ya kimya"</string> - <string name="turn_on_radio" msgid="3912793092339962371">"Washa mtandao-hewa"</string> + <string name="silent_mode" msgid="7167703389802618663">"Muundo wa kimya"</string> + <string name="turn_on_radio" msgid="3912793092339962371">"Fungua bila waya"</string> <string name="turn_off_radio" msgid="8198784949987062346">"Zima pasiwaya"</string> <string name="screen_lock" msgid="799094655496098153">"Funga skrini"</string> <string name="power_off" msgid="4266614107412865048">"Nishati imezimwa"</string> @@ -148,7 +148,7 @@ <string name="global_action_power_off" msgid="4471879440839879722">"Nishati imezimwa"</string> <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string> <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string> - <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string> + <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imefunguliwa"</string> <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"gumzo ya ndege"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndege IMEWASHWA"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"gumzo ya ndege IMEZIMWA"</string> @@ -662,7 +662,7 @@ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"Kadi yako ya SIM imelemazwa kabisa. "\n" tafadhali wasiliana na mtoa huduma wako wa psiwaya ili kupata kadi nyingine ya SIM."</string> <string name="emergency_calls_only" msgid="6733978304386365407">"Simu za dharura pekee"</string> <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Mtandao umefungwa"</string> - <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Kadi ya SIM imefungwa na PUK."</string> + <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Kadi ya SIM imefungwana PUK."</string> <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Tafadhali angalia Mwongozo wa Mtumiaji au wasiliana na Huduma kwa Wateja."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Kadi ya SIM imefungwa."</string> <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Inafungua kadi ya SIM..."</string> @@ -680,7 +680,7 @@ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Fungua akaunti"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Majaribio mengi ya mchoro!"</string> <string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"Kufungua, ingia na akaunti yako ya Google"</string> - <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Jina la mtumiaji (barua pepe)"</string> + <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Jina la mtumiaji/Barua pepe)"</string> <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Nenosiri"</string> <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Ingia"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Jina batili la mtumiaji au nywila"</string> @@ -697,7 +697,7 @@ <string name="factorytest_failed" msgid="5410270329114212041">"Jaribio la kiwanda limeshindikana"</string> <string name="factorytest_not_system" msgid="4435201656767276723">"Tendo la JARIBIO_LA KIWANDA linahimiliwa tu kwa furushi zilizosakinishwa katika /system/app."</string> <string name="factorytest_no_action" msgid="872991874799998561">"Hakuna furushi lililopatikana ambalo linatoa tendo la JARIBIO_LA KIWANDA."</string> - <string name="factorytest_reboot" msgid="6320168203050791643">"Washa tena"</string> + <string name="factorytest_reboot" msgid="6320168203050791643">"Fungua upya"</string> <string name="js_dialog_title" msgid="8143918455087008109">"Ukurasa ulio \'<xliff:g id="TITLE">%s</xliff:g>\' unasema:"</string> <string name="js_dialog_title_default" msgid="6961903213729667573">"HatiJava"</string> <string name="js_dialog_before_unload" msgid="1901675448179653089">"Toka kwa ukurasa huu?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Chagua Sawa ili kuendelea, au Ghairi ili kubaki kwenye ukurasa wa sasa."</string> @@ -740,7 +740,7 @@ <string name="save_password_notnow" msgid="6389675316706699758">"Si Sasa"</string> <string name="save_password_remember" msgid="6491879678996749466">"Kumbuka"</string> <string name="save_password_never" msgid="8274330296785855105">"Katu"</string> - <string name="open_permission_deny" msgid="5661861460947222274">"Huna idhini ya kufungua ukurasa huu."</string> + <string name="open_permission_deny" msgid="5661861460947222274">"Huna idhini ya kuona ukurasa huu."</string> <string name="text_copied" msgid="4985729524670131385">"Maandishi yamenakiliwa kwenye ubao klipu."</string> <string name="more_item_label" msgid="4650918923083320495">"Zaidi"</string> <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string> @@ -830,7 +830,7 @@ <string name="day" msgid="8144195776058119424">"siku"</string> <string name="days" msgid="4774547661021344602">"siku"</string> <string name="hour" msgid="2126771916426189481">"saa"</string> - <string name="hours" msgid="894424005266852993">"masaa"</string> + <string name="hours" msgid="894424005266852993">"saa"</string> <string name="minute" msgid="9148878657703769868">"dakika"</string> <string name="minutes" msgid="5646001005827034509">"Dakika"</string> <string name="second" msgid="3184235808021478">"sekunde"</string> @@ -859,11 +859,15 @@ <string name="copyUrl" msgid="2538211579596067402">"Nakili URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Chagua maandishi"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Uchaguzi wa maandishi?"</string> - <string name="addToDictionary" msgid="9090375111134433012">"ongeza kwa kamusi"</string> - <string name="deleteText" msgid="7070985395199629156">"futa"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Mbinu ya uingizaji"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Vitendo vya maandishi"</string> - <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nafasi ni ndogo"</string> + <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nafasi kidogo"</string> <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">" Nafasi ya hifadhi ya kompyuta ndogo inaisha."</string> <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Nafasi ya hifadhi ya simu inaisha."</string> <string name="ok" msgid="5970060430562524910">"Sawa"</string> @@ -930,7 +934,7 @@ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toni mlio chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> <string name="ringtone_silent" msgid="4440324407807468713">"Kimya"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Toni za mlio"</string> - <string name="ringtone_unknown" msgid="5477919988701784788">"Mlio amabo haujulikani"</string> + <string name="ringtone_unknown" msgid="5477919988701784788">"Mkirizo amabo haujulikani"</string> <plurals name="wifi_available"> <item quantity="one" msgid="6654123987418168693">"Mtandao wa Wi-Fi unapatikana"</item> <item quantity="other" msgid="4192424489168397386">"Mitandao ya Wi-Fi inapatikana"</item> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Tendua ufutaji."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Usifanye chochote kwa sasa."</string> <string name="choose_account_label" msgid="4191313562041125787">"Chagua akaunti"</string> - <string name="add_account_label" msgid="2935267344849993553">"Ongeza akaunti"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Akaunti gani ungependa kutumia?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Ongeza akaunti"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Ongezeko"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Punguza"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> gonga na shikilia"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Hifadhi ya USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Hariri..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Onyo la matumizi ya data"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Gusa ili kuangalia matumizi na mipangilio"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data ya 2G-3G imelemazwa"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data ya 4G imelemazwa"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Data ya simu imelemazwa"</string> diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml index 13bbac6..7fa7658 100644 --- a/core/res/res/values-sw600dp/config.xml +++ b/core/res/res/values-sw600dp/config.xml @@ -32,5 +32,8 @@ <!-- see comment in values/config.xml --> <dimen name="config_prefDialogWidth">580dp</dimen> + <!-- If true, the screen can be rotated via the accelerometer in all 4 + rotations as the default behavior. --> + <bool name="config_allowAllRotations">true</bool> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index ebeee42..f535cae 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"คัดลอก URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"เลือกข้อความ..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"การเลือกข้อความ"</string> - <string name="addToDictionary" msgid="9090375111134433012">"เพิ่มในพจนานุกรม"</string> - <string name="deleteText" msgid="7070985395199629156">"ลบ"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"เหลือที่ว่างน้อย"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"เลิกทำการลบ"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"ไม่ต้องทำอะไรในขณะนี้"</string> <string name="choose_account_label" msgid="4191313562041125787">"เลือกบัญชี"</string> - <string name="add_account_label" msgid="2935267344849993553">"เพิ่มบัญชี"</string> - <string name="choose_account_text" msgid="6891230675141555481">"คุณต้องการใช้บัญชีใด"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"เพิ่มบัญชี"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"การเพิ่ม"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"การลด"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"แตะ <xliff:g id="VALUE">%s</xliff:g> ค้างไว้"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"ที่เก็บข้อมูล USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"แก้ไข..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"คำเตือนการใช้ข้อมูล"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"แตะเพื่อดูการใช้งานและการตั้งค่า"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"ปิดใช้งานข้อมูล 2G-3G"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"ปิดใช้งานข้อมูล 4G"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"ปิดใช้งานข้อมูลมือถือ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 4946c4d..3803181 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopyahin ang URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Pumili ng teksto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Pagpili ng teksto"</string> - <string name="addToDictionary" msgid="9090375111134433012">"idagdag sa diksyunaryo"</string> - <string name="deleteText" msgid="7070985395199629156">"tanggalin"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mababa sa espasyo"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"I-undo ang mga pagtanggal."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Walang gawin sa ngayon."</string> <string name="choose_account_label" msgid="4191313562041125787">"Pumili ng account"</string> - <string name="add_account_label" msgid="2935267344849993553">"Magdagdag ng account"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Aling account ang gusto mong gamitin?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Magdagdag ng account"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Taasan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Babaan"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tapikin at pindutin nang matagal."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB storage"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"I-edit..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Babala sa paggamit ng data"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Pindutin upang tingnan ang paggamit at mga setting"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Di pinagana ang data ng 2G-3G"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Di pinagana ang data ng 4G"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Di pinagana ang data ng mobile"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 66cd839..637cbd6 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"URL\'yi kopyala"</string> <string name="selectTextMode" msgid="6738556348861347240">"Metin seç..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Metin seçimi"</string> - <string name="addToDictionary" msgid="9090375111134433012">"sözlüğe ekle"</string> - <string name="deleteText" msgid="7070985395199629156">"sil"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Giriş yöntemi"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Metin eylemleri"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Yer az"</string> @@ -1164,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB depolama birimi"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Düzenle..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Veri kullanım uyarısı"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Kullanımı ve ayarları görmek için dokunun"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G verileri devre dışı"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G verileri devre dışı"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil veriler devre dışı"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 8d2b826..1eb5ed0 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Копіюв. URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Вибрати текст..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Вибір тексту"</string> - <string name="addToDictionary" msgid="9090375111134433012">"додати в словник"</string> - <string name="deleteText" msgid="7070985395199629156">"видалити"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недост. місця"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Скасувати видалення."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Наразі нічого не робіть."</string> <string name="choose_account_label" msgid="4191313562041125787">"Вибрати обліковий запис"</string> - <string name="add_account_label" msgid="2935267344849993553">"Додати обліковий запис"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Який обліковий запис потрібно використовувати?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Додати облік. запис"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Додати"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Відняти"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – торкніться й утримуйте."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Носій USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Редагувати..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Застереження про використ. даних"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Торкн.для перегл.викор.і налашт."</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Дані 2G–3G вимкнено"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Дані 4G вимкнено"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобільне передав. даних вимкнено"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 4c1c2d9..e4d3423 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Sao chép URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Chọn văn bản..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Lựa chọn văn bản"</string> - <string name="addToDictionary" msgid="9090375111134433012">"thêm vào từ điển"</string> - <string name="deleteText" msgid="7070985395199629156">"xóa"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Phương thức nhập"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Tác vụ văn bản"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Còn ít dung lượng"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Hoàn tác các tác vụ xóa."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Ngay bây giờ bạn không cần làm gì cả."</string> <string name="choose_account_label" msgid="4191313562041125787">"Chọn tài khoản"</string> - <string name="add_account_label" msgid="2935267344849993553">"Thêm tài khoản"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Bạn muốn sử dụng tài khoản nào?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Thêm tài khoản"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Tăng dần"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Giảm dần"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Bấm và giữ <xliff:g id="VALUE">%s</xliff:g>."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Bộ lưu trữ USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Chỉnh sửa..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Cảnh báo sử dụng dữ liệu"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Chạm để xem việc sử dụng và cài đặt"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Đã tắt dữ liệu 2G-3G"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G dữ liệu bị vô hiệu hóa"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Dữ liệu di động bị vô hiệu hóa"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index fb9d4c8..a306d67 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"复制网址"</string> <string name="selectTextMode" msgid="6738556348861347240">"选择文字..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"文字选择"</string> - <string name="addToDictionary" msgid="9090375111134433012">"添加到词典"</string> - <string name="deleteText" msgid="7070985395199629156">"删除"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"输入法"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"存储空间不足"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"撤消删除。"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"目前不进行任何操作。"</string> <string name="choose_account_label" msgid="4191313562041125787">"选择帐户"</string> - <string name="add_account_label" msgid="2935267344849993553">"添加帐户"</string> - <string name="choose_account_text" msgid="6891230675141555481">"您希望使用哪个帐户?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"添加帐户"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"减少"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"点按 <xliff:g id="VALUE">%s</xliff:g> 次并按住。"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB 存储器"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"编辑..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"数据使用情况警告"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"触摸可查看使用情况和设置"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G 数据已停用"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G 数据已停用"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"移动数据已停用"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 37f4b39..6b13a95 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"複製網址"</string> <string name="selectTextMode" msgid="6738556348861347240">"選取文字..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string> - <string name="addToDictionary" msgid="9090375111134433012">"新增至字典"</string> - <string name="deleteText" msgid="7070985395199629156">"刪除"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"輸入方式"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"儲存空間即將不足"</string> @@ -1109,9 +1113,12 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"復原刪除。"</string> <string name="sync_do_nothing" msgid="8717589462945226869">"暫不執行。"</string> <string name="choose_account_label" msgid="4191313562041125787">"選取帳戶"</string> - <string name="add_account_label" msgid="2935267344849993553">"新增帳戶"</string> - <string name="choose_account_text" msgid="6891230675141555481">"您要使用哪個帳戶?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"新增帳戶"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"減少"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 持續輕按。"</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"編輯..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"資料用量警告"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"輕觸即可查看使用量和設定"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"已停用 2G-3G 數據"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"已停用 4G 數據"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"已停用行動數據"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 845d4b1..f7dde4f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -21,11 +21,11 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="byteShort" msgid="8340973892742019101">"B"</string> - <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string> - <string name="megabyteShort" msgid="6355851576770428922">"MB"</string> - <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string> - <string name="terabyteShort" msgid="231613018159186962">"TB"</string> - <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> + <string name="kilobyteShort" msgid="5973789783504771878">"I-KB"</string> + <string name="megabyteShort" msgid="6355851576770428922">"I-MB"</string> + <string name="gigabyteShort" msgid="3259882455212193214">"I-GB"</string> + <string name="terabyteShort" msgid="231613018159186962">"I-TB"</string> + <string name="petabyteShort" msgid="5637816680144990219">"I-PB"</string> <string name="fileSizeSuffix" msgid="7670819340156489359">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> <string name="untitled" msgid="6071602020171759109">"<untitled>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> @@ -80,11 +80,11 @@ <string name="serviceClassVoice" msgid="1258393812335258019">"Izwi"</string> <string name="serviceClassData" msgid="872456782077937893">"Idatha"</string> <string name="serviceClassFAX" msgid="5566624998840486475">"Ifeksi"</string> - <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string> + <string name="serviceClassSMS" msgid="2015460373701527489">"I-SMS"</string> <string name="serviceClassDataAsync" msgid="4523454783498551468">"Vumelanisa"</string> <string name="serviceClassDataSync" msgid="7530000519646054776">"Vumelanisa"</string> <string name="serviceClassPacket" msgid="6991006557993423453">"Iphakethe"</string> - <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string> + <string name="serviceClassPAD" msgid="3235259085648271037">"I-PAD"</string> <string name="roamingText0" msgid="7170335472198694945">"Isikhombisi Sokuzulazula Sivuliwe"</string> <string name="roamingText1" msgid="5314861519752538922">"Isibonisi Sokuzulazula Sivaliwe"</string> <string name="roamingText2" msgid="8969929049081268115">"Isikhombisi Sokuzulazula Siyafulesha"</string> @@ -285,7 +285,7 @@ <string name="permlab_deletePackages" msgid="3343439331576348805">"susa izinhlelo zokusebenza"</string> <string name="permdesc_deletePackages" msgid="3634943677518723314">"Ivumela izinhlelo zokusebenza ukususa amaphakheji e-Android. Izinhlelo zokusebenza ezinonya zingase zisebenzise lokhu ukususa izinhlelo zokusebenza ezibalulekile."</string> <string name="permlab_clearAppUserData" msgid="2192134353540277878">"susa enye idatha yezinhlelo zokusebenza"</string> - <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Ivumela uhlelo lokusebenza ukuthi lisule idatha yomsebenzisi."</string> + <string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Ivumela uhlelo lokusebenza ukuba lisule idatha yomsebenzisi."</string> <string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"susa ezinye izilondolozi zesikhashana zezinhlelo zokusebenza"</string> <string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"Ivumela uhlelo lokusebenza ukususa amafayela okulondoloza okwesikhashana."</string> <string name="permlab_getPackageSize" msgid="4799785352306641460">"linganisa isikhala sokugcina uhlelo lokusebenza"</string> @@ -336,7 +336,7 @@ <string name="permdesc_writeCalendar" msgid="5368129321997977226">"Ivumela uhlelo lokusebenza ukuthumela izimemo njengomnikazi wekhalenda futhi ufake, ukhiphe, ushintshe izenzakalo ongakwazi ukuziguqula kwidivaysi yakho, kuhlanganise lezo zabangani noma osebenza nabo. Uhlelo lokusebenza olu-malicious olunalemvume lungase luthumele ama-imeyili angafuneki ukuba aphume kubanikazi bekhalenda, luguqule izenzakalo ngaphandle kolwazi lomnikazi, noma lufake izenzakalo mbumbulu ezintsha."</string> <string name="permlab_accessMockLocation" msgid="8688334974036823330">"lungisela imithombo yendawo ukuhlolwa"</string> <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Yenza imithombo yendawo ukuhlola. Izinhlelo ezinonya zingase zisebenzise lokhu ukukhipha indawo futhi/noma isimo esibuyiswe imithombo yendawo yangempela njengabahlinzeki be-GPS noma Inethiwekhi."</string> - <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"finyelela kweminye imiyalo yokunikeza indawo"</string> + <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"finyelela eminye imiyalo yokunikeza indawo"</string> <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Finyelela kweminye imiyalo yendawo eyengeziwe. Izinhlelo ezinonya zingase zisebenzise lokhu ukuphazamaisa ukusebenza kwe-GPS noma eminye imithombo yezinye izindawo."</string> <string name="permlab_installLocationProvider" msgid="6578101199825193873">"imvume yokufaka umhlinzeki wendawo"</string> <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Yenza imithombo yokudlala ukuhlola. Izinhlelo ezinonya zingase zisebenzise lokhu ukukhipha indawo futhi/noma isimo esibuyiswe imithombo yendawo yangempela njenge-GPS noma abahlinzeki Benethiwekhi noma zigade futhi zibike indawo yakho njengomthombo wangaphandle."</string> @@ -397,7 +397,7 @@ <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Ivumela uhlelo lokusebenza ukuqalisa amalungiselelo e-CDMA. Izinhlelo ezinonya ngokungadingekile zingaqalisa amalungiselelo e-CDMA."</string> <string name="permlab_locationUpdates" msgid="7785408253364335740">"lawula izaziso zokubuyekeza indawo"</string> <string name="permdesc_locationUpdates" msgid="2300018303720930256">"Ivumela ukuvula/ukuvimbela izaziso zesibuyekezo sendawo kusuka emsakazweni. Akumele isebenziswe izinhlelo zokusebenza ezivamile."</string> - <string name="permlab_checkinProperties" msgid="7855259461268734914">"finyelela kwizakhiwo zokuhlola"</string> + <string name="permlab_checkinProperties" msgid="7855259461268734914">"finyelela izakhiwo zokuhlola"</string> <string name="permdesc_checkinProperties" msgid="7150307006141883832">"Ivumela ukufinyelela kokufunda/ukubhalela ezicini ezilayishwe insizakalo zokuhlola. Akuyona eyokusebenziswa izinhlelo zokusebenza ezivamile."</string> <string name="permlab_bindGadget" msgid="776905339015863471">"khetha izinqunjwana"</string> <string name="permdesc_bindGadget" msgid="2098697834497452046">"Ivumela uhlelo lokusebenza ukutshela isistimu ukuthi yimaphi amawijethi angasebenziswa yiziphi izinhlelo zokusebenza. Ngalemvume, izinhlelo zokusebenza zinganikeza ukufinyelela idatha yomuntu siqu kwezinye izinhlelo zokusebenza. Ayisebenziswa izinhlelo zokusebenza ezivamile."</string> @@ -678,7 +678,7 @@ <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Zama futhi emizuzwini engu <xliff:g id="NUMBER">%d</xliff:g>."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ukhohlwe iphethini?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Ukuvulwa kwe-akhawunti"</string> - <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Kunemizamo eminingi kakhulu yephathini!"</string> + <string name="lockscreen_glogin_too_many_attempts" msgid="2446246026221678244">"Kunemizama eminingi kakhulu yephathini!"</string> <string name="lockscreen_glogin_instructions" msgid="1816635201812207709">"Ukuvula, ngena ngemvumekwi-akhawunti ye-Google"</string> <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Igama lomsebenzisi (i-imeyli)"</string> <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"I-password"</string> @@ -859,8 +859,12 @@ <string name="copyUrl" msgid="2538211579596067402">"Kopisha i-URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Khetha umbhalo..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Inketho yombhalo"</string> - <string name="addToDictionary" msgid="9090375111134433012">"Faka esichazinimazwi"</string> - <string name="deleteText" msgid="7070985395199629156">"susa"</string> + <!-- unknown placeholder WORD in addToDictionary --> + <skip /> + <!-- no translation found for addToDictionary (9090375111134433012) --> + <skip /> + <!-- no translation found for deleteText (7070985395199629156) --> + <skip /> <string name="inputMethod" msgid="1653630062304567879">"Indlela yokufakwayo"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Izenzo zombhalo"</string> <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Isikhala sincane"</string> @@ -876,9 +880,9 @@ <string name="capital_off" msgid="6815870386972805832">"VALIWE"</string> <string name="whichApplication" msgid="4533185947064773386">"Qedela isenzo usebenzisa"</string> <string name="alwaysUse" msgid="4583018368000610438">"Sebenzisa ngokuzenzakalelayo kulesenzo."</string> - <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Sula okuzenzakalelayo Emalungiselelweni Asekhaya; Uhlelo Lokusebenza; Phatha izinhlelo zokusebenza"</string> + <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Sula okuzenzakalelayo Emalungiselelweni Asekhaya > Uhlelo Lokusebenza > Phatha izinhlelo zokusebenza"</string> <string name="chooseActivity" msgid="1009246475582238425">"Khetha isenzo"</string> - <string name="chooseUsbActivity" msgid="7892597146032121735">"Khethela idivayisi ye-USB uhlelo lokusebenza"</string> + <string name="chooseUsbActivity" msgid="7892597146032121735">"Khethela idivayisi ye-USB uhlelolokusebenza"</string> <string name="noApplications" msgid="1691104391758345586">"Azikho izinhlelo zokusebenza ezingenza lesi sinyathelo."</string> <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ngeshwa, <xliff:g id="APPLICATION">%1$s</xliff:g> kumile."</string> @@ -1109,11 +1113,14 @@ <string name="sync_undo_deletes" msgid="8610996708225006328">"Guqula okususiwe."</string> <string name="sync_do_nothing" msgid="8717589462945226869">"Ungenzi lutho okwamanje."</string> <string name="choose_account_label" msgid="4191313562041125787">"Khetha i-akhawunti"</string> - <string name="add_account_label" msgid="2935267344849993553">"Yengeza i-akhawunti"</string> - <string name="choose_account_text" msgid="6891230675141555481">"Ikuphi ongathanda ukukusebenzisa?"</string> - <string name="add_account_button_label" msgid="3611982894853435874">"Engeza i-akhawunti"</string> + <!-- no translation found for add_account_label (2935267344849993553) --> + <skip /> + <!-- no translation found for choose_account_text (6891230675141555481) --> + <skip /> + <!-- no translation found for add_account_button_label (3611982894853435874) --> + <skip /> <string name="number_picker_increment_button" msgid="4830170763103463443">"Nciphisa"</string> - <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string> + <string name="number_picker_decrement_button" msgid="2576606679160067262">"i-Descrement"</string> <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> chofoza bese ucindezela."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Shishilizisa kwenyuke kuye ekwenyusweni kwehle kuye ekwehlisweni."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Umzuzu wokwenyusa."</string> @@ -1161,7 +1168,10 @@ <string name="storage_usb" msgid="3017954059538517278">"Isitoreji se-USB"</string> <string name="extract_edit_menu_button" msgid="302060189057163906">"Hlela..."</string> <string name="data_usage_warning_title" msgid="1955638862122232342">"Isexwayiso sokusetshenziswa kwedatha"</string> - <string name="data_usage_warning_body" msgid="7217480745540055170">"Thinta ze ubone ukusebenza kanye nezisetho"</string> + <!-- unknown placeholder SIZE in data_usage_warning_body --> + <skip /> + <!-- no translation found for data_usage_warning_body (7217480745540055170) --> + <skip /> <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Idatha ye-2G-3G ikhubasekisiwe"</string> <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Idatha ye-4G ikhubazekisiwe"</string> <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Idatha yeselula ikhubazekile"</string> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 11531fc..727c6ea 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -710,11 +710,12 @@ <enum name="preferExternal" value="2" /> </attr> - <!-- Extra options for an activity's UI. If specified on the application + <!-- Extra options for an activity's UI. Applies to either the {@code <activity>} or + {@code <application>} tag. If specified on the {@code <application>} tag these will be considered defaults for all activities in the application. --> <attr name="uiOptions"> - <!-- No extra UI options. --> + <!-- No extra UI options. This is the default. --> <flag name="none" value="0" /> <!-- Split the options menu into a separate bar at the bottom of the screen when severely constrained for horizontal space. diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index ddb9942..f0c6d09 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -112,6 +112,9 @@ <color name="lockscreen_clock_am_pm">#ff9a9a9a</color> <color name="lockscreen_owner_info">#ff9a9a9a</color> + <!-- FaceLock --> + <color name="facelock_color_background">#000000</color> + <!-- For holo theme --> <drawable name="screen_background_holo_light">#fff3f3f3</drawable> <drawable name="screen_background_holo_dark">#ff000000</drawable> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8fea35f..5eb3e5a 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -231,7 +231,7 @@ <!-- If true, the screen can be rotated via the accelerometer in all 4 rotations as the default behavior. --> - <bool name="config_allowAllRotations">true</bool> + <bool name="config_allowAllRotations">false</bool> <!-- If true, the direction rotation is applied to get to an application's requested orientation is reversed. Normally, the model is that landscape is diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index f1fc42c..1cd3911 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -158,7 +158,10 @@ <dimen name="keyguard_lockscreen_status_line_font_size">14sp</dimen> <!-- Size of right margin on Unsecure unlock LockScreen --> - <dimen name="keyguard_lockscreen_status_line_font_right_margin">45dip</dimen> + <dimen name="keyguard_lockscreen_status_line_font_right_margin">42dip</dimen> + + <!-- Size of top margin on Clock font to edge on unlock LockScreen --> + <dimen name="keyguard_lockscreen_status_line_clockfont_top_margin">24dip</dimen> <!-- Minimum popup width for selecting an activity in ActivityChooserDialog/ActivityChooserView. --> <dimen name="activity_chooser_popup_min_width">200dip</dimen> @@ -178,4 +181,6 @@ <!-- Default width for a textview error popup --> <dimen name="textview_error_popup_default_width">240dip</dimen> + <!-- Volume panel y offset --> + <dimen name="volume_panel_top">80dp</dimen> </resources> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 346a3d29..88b45fd 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -250,7 +250,7 @@ please see styles_device_defaults.xml. </style> <style name="TextAppearance.EasyCorrectSuggestion" parent="TextAppearance.Suggestion"> - <item name="android:textUnderlineColor">@color/holo_blue_dark</item> + <item name="android:textUnderlineColor">#ff888888</item> </style> <style name="TextAppearance.MisspelledSuggestion" parent="TextAppearance.Suggestion"> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 3378dc8..1987d99 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -94,7 +94,7 @@ please see themes_device_defaults.xml. <item name="textAppearanceButton">@android:style/TextAppearance.Widget.Button</item> - <item name="editTextColor">?android:attr/textColorPrimaryInverse</item> + <item name="editTextColor">@android:color/primary_text_light</item> <item name="editTextBackground">@android:drawable/edit_text</item> <item name="candidatesTextStyleSpans">@android:string/candidates_style</item> @@ -410,7 +410,7 @@ please see themes_device_defaults.xml. <item name="textColorLink">@android:color/link_text_light</item> <item name="textColorLinkInverse">@android:color/link_text_dark</item> - <item name="editTextColor">?android:attr/textColorPrimary</item> + <item name="editTextColor">@android:color/primary_text_light</item> <item name="listChoiceBackgroundIndicator">@android:drawable/list_selector_background</item> <item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item> diff --git a/core/tests/bandwidthtests/Android.mk b/core/tests/bandwidthtests/Android.mk index 3d56141..6871efd 100644 --- a/core/tests/bandwidthtests/Android.mk +++ b/core/tests/bandwidthtests/Android.mk @@ -27,4 +27,4 @@ LOCAL_PACKAGE_NAME := BandwidthTests include $(BUILD_PACKAGE) -include $(call all-makefiles-under,$(LOCAL_PATH)) +include $(call all-makefiles-under,$(LOCAL_PATH))
\ No newline at end of file diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java index be740d3..9eee2f0 100644 --- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java +++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/BandwidthTest.java @@ -120,6 +120,42 @@ public class BandwidthTest extends InstrumentationTestCase { } /** + * Ensure that downloading on wifi reports reasonable stats. + */ + @LargeTest + public void testWifiUpload() { + assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); + // Download a file from the server. + String ts = Long.toString(System.currentTimeMillis()); + String targetUrl = BandwidthTestUtil.buildDownloadUrl( + mTestServer, FILE_SIZE, mDeviceId, ts); + File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME); + assertTrue(BandwidthTestUtil.DownloadFromUrl(targetUrl, tmpSaveFile)); + + ts = Long.toString(System.currentTimeMillis()); + NetworkStats pre_test_stats = fetchDataFromProc(mUid); + TrafficStats.startDataProfiling(mContext); + assertTrue(BandwidthTestUtil.postFileToServer(mTestServer, mDeviceId, ts, tmpSaveFile)); + NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext); + Log.d(LOG_TAG, prof_stats.toString()); + NetworkStats post_test_stats = fetchDataFromProc(mUid); + NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats); + + // Output measurements to instrumentation out, so that it can be compared to that of + // the server. + Bundle results = new Bundle(); + results.putString("device_id", mDeviceId); + results.putString("timestamp", ts); + results.putInt("size", FILE_SIZE); + AddStatsToResults(PROF_LABEL, prof_stats, results); + AddStatsToResults(PROC_LABEL, proc_stats, results); + getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results); + + // Clean up. + assertTrue(cleanUpFile(tmpSaveFile)); + } + + /** * We want to make sure that if we use the Download Manager to download stuff, * accounting still goes to the app making the call and that the numbers still make sense. */ diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java index d850169..577767c 100644 --- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java +++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/BandwidthTestUtil.java @@ -18,6 +18,15 @@ package com.android.bandwidthtest.util; import android.util.Log; +import com.android.internal.http.multipart.FilePart; +import com.android.internal.http.multipart.MultipartEntity; +import com.android.internal.http.multipart.Part; +import com.android.internal.http.multipart.StringPart; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.ByteArrayBuffer; import java.io.BufferedInputStream; @@ -80,7 +89,7 @@ public class BandwidthTestUtil { * Download a given file from a target url to a given destination file. * @param targetUrl the url to download * @param file the {@link File} location where to save to - * @return true if it succeeded. + * @return true if it succeeded */ public static boolean DownloadFromUrl(String targetUrl, File file) { try { @@ -106,4 +115,39 @@ public class BandwidthTestUtil { return true; } + /** + * Post a given file for a given device and timestamp to the server. + * @param server {@link String} url of test server + * @param deviceId {@link String} device id that is uploading + * @param timestamp {@link String} timestamp + * @param file {@link File} to upload + * @return true if it succeeded + */ + public static boolean postFileToServer(String server, String deviceId, String timestamp, + File file) { + try { + Log.d(LOG_TAG, "Uploading begining"); + HttpClient httpClient = new DefaultHttpClient(); + String uri = server; + if (!uri.endsWith("/")) { + uri += "/"; + } + uri += "upload"; + Log.d(LOG_TAG, "Upload url:" + uri); + HttpPost postRequest = new HttpPost(uri); + Part[] parts = { + new StringPart("device_id", deviceId), + new StringPart("timestamp", timestamp), + new FilePart("file", file) + }; + MultipartEntity reqEntity = new MultipartEntity(parts, postRequest.getParams()); + postRequest.setEntity(reqEntity); + HttpResponse res = httpClient.execute(postRequest); + res.getEntity().getContent().close(); + } catch (IOException e) { + Log.e(LOG_TAG, "Could not upload file with error: " + e); + return false; + } + return true; + } } diff --git a/core/tests/coretests/apks/install_verifier_bad/Android.mk b/core/tests/coretests/apks/install_verifier_bad/Android.mk new file mode 100644 index 0000000..b50cfd0 --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_bad/Android.mk @@ -0,0 +1,11 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_bad + +include $(BUILD_PACKAGE) + diff --git a/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml new file mode 100644 index 0000000..0170cdd --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.frameworks.coretests.install_verifier_bad"> + + <package-verifier android:name="com.android.frameworks.coretests.nonexistent" android:publicKey="Zm9vYmFy" /> + + <application android:hasCode="false"> + </application> +</manifest> diff --git a/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml new file mode 100644 index 0000000..3b8b3b1 --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Just need this dummy file to have something to build. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="dummy">dummy</string> +</resources> diff --git a/core/tests/coretests/apks/install_verifier_good/Android.mk b/core/tests/coretests/apks/install_verifier_good/Android.mk new file mode 100644 index 0000000..a48a80e --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_good/Android.mk @@ -0,0 +1,10 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_good + +include $(BUILD_PACKAGE) diff --git a/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml new file mode 100644 index 0000000..90135a5 --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.frameworks.coretests.install_verifier_bad"> + + <package-verifier android:name="com.android.frameworks.coretests" android:publicKey="MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAnHgFkqwNXTgc3qpl7MimAG42SAxtcgexIBG+UIY6q+K1XQCa33FG1vIgIoDHzU172yYkO4qAbCazSxN1I6SSaCJJBNwBST58Cs8aBch09psDe2AwnZB00kKA4WutKoc0NhlR6vcqSC0JsgSxh14SrJjBqnc9aAC56v3lbVi+2OjaFvmjYAmcN6g0pt/tt7a0SgSeB6Jp/M8sVJbyzzbWTfkKO42PNKO6q0z1M3GrJ3GbO6WHVK0MU/wU4dtF1R4jT7vpPJuk7fnOVCYTUOxTVge/aaL/SqB9tffqIA0JpsG0niFAL4ntEZCJOqtakYDxUugvhaRXU89fwZBxxe7IJwIBAw==" /> + + <application android:hasCode="false"> + </application> +</manifest> diff --git a/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml new file mode 100644 index 0000000..3b8b3b1 --- /dev/null +++ b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Just need this dummy file to have something to build. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="dummy">dummy</string> +</resources> |