diff options
469 files changed, 5156 insertions, 2058 deletions
diff --git a/Android.mk b/Android.mk index 2d938d94a7a3..a45a4d6bf770 100644 --- a/Android.mk +++ b/Android.mk @@ -172,6 +172,7 @@ LOCAL_SRC_FILES += \ core/java/android/hardware/input/IInputManager.aidl \ core/java/android/hardware/input/IInputDevicesChangedListener.aidl \ core/java/android/hardware/location/IActivityRecognitionHardware.aidl \ + core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl \ core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl \ core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl \ core/java/android/hardware/location/IFusedLocationHardware.aidl \ diff --git a/api/current.txt b/api/current.txt index 2dccf7eb162c..924dcb20dad1 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1809,6 +1809,7 @@ package android { field public static final int defaultVoiceMailAlphaTag = 17039364; // 0x1040004 field public static final int dialog_alert_title = 17039380; // 0x1040014 field public static final int emptyPhoneNumber = 17039366; // 0x1040006 + field public static final int fingerprint_icon_content_description = 17039384; // 0x1040018 field public static final int httpErrorBadUrl = 17039367; // 0x1040007 field public static final int httpErrorUnsupportedScheme = 17039368; // 0x1040008 field public static final int no = 17039369; // 0x1040009 @@ -18165,8 +18166,11 @@ package android.net { method public boolean requestBandwidthUpdate(android.net.Network); method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent); + method public deprecated boolean requestRouteToHost(int, int); method public deprecated void setNetworkPreference(int); method public static deprecated boolean setProcessDefaultNetwork(android.net.Network); + method public deprecated int startUsingNetworkFeature(int, java.lang.String); + method public deprecated int stopUsingNetworkFeature(int, java.lang.String); method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback); method public void unregisterNetworkCallback(android.app.PendingIntent); field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; @@ -28831,6 +28835,7 @@ package android.service.voice { ctor public VoiceInteractionSession(android.content.Context); ctor public VoiceInteractionSession(android.content.Context, android.os.Handler); method public void closeSystemDialogs(); + method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public void finish(); method public android.content.Context getContext(); method public int getDisabledShowContext(); @@ -30306,6 +30311,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder toBuilder(); method public void writeToParcel(android.os.Parcel, int); field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2 + field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40 field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1 field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10 field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4 diff --git a/api/removed.txt b/api/removed.txt index 6d88cb654a89..642d2a8ac19c 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -34,13 +34,6 @@ package android.media { package android.net { - public class ConnectivityManager { - method public deprecated boolean requestRouteToHost(int, int); - method public deprecated boolean requestRouteToHostAddress(int, java.net.InetAddress); - method public deprecated int startUsingNetworkFeature(int, java.lang.String); - method public deprecated int stopUsingNetworkFeature(int, java.lang.String); - } - public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory { method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); } diff --git a/api/system-current.txt b/api/system-current.txt index e32f9a153f46..133e7eb7ae8d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1907,6 +1907,7 @@ package android { field public static final int defaultVoiceMailAlphaTag = 17039364; // 0x1040004 field public static final int dialog_alert_title = 17039380; // 0x1040014 field public static final int emptyPhoneNumber = 17039366; // 0x1040006 + field public static final int fingerprint_icon_content_description = 17039384; // 0x1040018 field public static final int httpErrorBadUrl = 17039367; // 0x1040007 field public static final int httpErrorUnsupportedScheme = 17039368; // 0x1040008 field public static final int no = 17039369; // 0x1040009 @@ -19678,8 +19679,11 @@ package android.net { method public boolean requestBandwidthUpdate(android.net.Network); method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent); + method public deprecated boolean requestRouteToHost(int, int); method public deprecated void setNetworkPreference(int); method public static deprecated boolean setProcessDefaultNetwork(android.net.Network); + method public deprecated int startUsingNetworkFeature(int, java.lang.String); + method public deprecated int stopUsingNetworkFeature(int, java.lang.String); method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback); method public void unregisterNetworkCallback(android.app.PendingIntent); field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; @@ -31000,6 +31004,7 @@ package android.service.voice { ctor public VoiceInteractionSession(android.content.Context); ctor public VoiceInteractionSession(android.content.Context, android.os.Handler); method public void closeSystemDialogs(); + method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public void finish(); method public android.content.Context getContext(); method public int getDisabledShowContext(); @@ -32531,6 +32536,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder toBuilder(); method public void writeToParcel(android.os.Parcel, int); field public static final int CAPABILITY_CALL_PROVIDER = 2; // 0x2 + field public static final int CAPABILITY_CALL_SUBJECT = 64; // 0x40 field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1 field public static final int CAPABILITY_MULTI_USER = 32; // 0x20 field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10 diff --git a/api/system-removed.txt b/api/system-removed.txt index 6d88cb654a89..642d2a8ac19c 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -34,13 +34,6 @@ package android.media { package android.net { - public class ConnectivityManager { - method public deprecated boolean requestRouteToHost(int, int); - method public deprecated boolean requestRouteToHostAddress(int, java.net.InetAddress); - method public deprecated int startUsingNetworkFeature(int, java.lang.String); - method public deprecated int stopUsingNetworkFeature(int, java.lang.String); - } - public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory { method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index d7a53565cdf1..b2fb906429eb 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1865,7 +1865,10 @@ public class Activity extends ContextThemeWrapper nci.children = children; nci.fragments = fragments; nci.loaders = loaders; - nci.voiceInteractor = mVoiceInteractor; + if (mVoiceInteractor != null) { + mVoiceInteractor.retainInstance(); + nci.voiceInteractor = mVoiceInteractor; + } return nci; } @@ -5551,6 +5554,9 @@ public class Activity extends ContextThemeWrapper mFragments.dumpLoaders(innerPrefix, fd, writer, args); mFragments.getFragmentManager().dump(innerPrefix, fd, writer, args); + if (mVoiceInteractor != null) { + mVoiceInteractor.dump(innerPrefix, fd, writer, args); + } if (getWindow() != null && getWindow().peekDecorView() != null && diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index b0d85419947a..fc71783a1b74 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1862,6 +1862,9 @@ public class Notification implements Parcelable } else { sb.append("null"); } + if (this.tickerText != null) { + sb.append(" tick"); + } sb.append(" defaults=0x"); sb.append(Integer.toHexString(this.defaults)); sb.append(" flags=0x"); diff --git a/core/java/android/app/VoiceInteractor.java b/core/java/android/app/VoiceInteractor.java index bf7458c0c245..823c4271adf2 100644 --- a/core/java/android/app/VoiceInteractor.java +++ b/core/java/android/app/VoiceInteractor.java @@ -27,6 +27,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.util.ArrayMap; +import android.util.DebugUtils; import android.util.Log; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.IVoiceInteractorCallback; @@ -34,6 +35,8 @@ import com.android.internal.app.IVoiceInteractorRequest; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -68,6 +71,7 @@ public final class VoiceInteractor { Context mContext; Activity mActivity; + boolean mRetaining; final HandlerCaller mHandlerCaller; final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { @@ -272,6 +276,29 @@ public final class VoiceInteractor { public void onDetached() { } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + sb.append(" "); + sb.append(getRequestTypeName()); + sb.append(" name="); + sb.append(mName); + sb.append('}'); + return sb.toString(); + } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mRequestInterface="); + writer.println(mRequestInterface.asBinder()); + writer.print(prefix); writer.print("mActivity="); writer.println(mActivity); + writer.print(prefix); writer.print("mName="); writer.println(mName); + } + + String getRequestTypeName() { + return "Request"; + } + void clear() { mRequestInterface = null; mContext = null; @@ -333,6 +360,18 @@ public final class VoiceInteractor { public void onConfirmationResult(boolean confirmed, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "Confirmation"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startConfirmation(packageName, callback, mPrompt, mExtras); @@ -515,6 +554,38 @@ public final class VoiceInteractor { public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mOptions != null) { + writer.print(prefix); writer.println("Options:"); + for (int i=0; i<mOptions.length; i++) { + Option op = mOptions[i]; + writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); + writer.print(prefix); writer.print(" mLabel="); writer.println(op.mLabel); + writer.print(prefix); writer.print(" mIndex="); writer.println(op.mIndex); + if (op.mSynonyms != null && op.mSynonyms.size() > 0) { + writer.print(prefix); writer.println(" Synonyms:"); + for (int j=0; j<op.mSynonyms.size(); j++) { + writer.print(prefix); writer.print(" #"); writer.print(j); + writer.print(": "); writer.println(op.mSynonyms.get(j)); + } + } + if (op.mExtras != null) { + writer.print(prefix); writer.print(" mExtras="); + writer.println(op.mExtras); + } + } + } + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "PickOption"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startPickOption(packageName, callback, mPrompt, mOptions, mExtras); @@ -560,6 +631,18 @@ public final class VoiceInteractor { public void onCompleteResult(Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "CompleteVoice"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startCompleteVoice(packageName, callback, mPrompt, mExtras); @@ -607,6 +690,18 @@ public final class VoiceInteractor { public void onAbortResult(Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); writer.println(mPrompt); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); writer.println(mExtras); + } + } + + String getRequestTypeName() { + return "AbortVoice"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startAbortVoice(packageName, callback, mPrompt, mExtras); @@ -650,6 +745,18 @@ public final class VoiceInteractor { public void onCommandResult(boolean isCompleted, Bundle result) { } + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mCommand="); writer.println(mCommand); + if (mArgs != null) { + writer.print(prefix); writer.print("mArgs="); writer.println(mArgs); + } + } + + String getRequestTypeName() { + return "Command"; + } + IVoiceInteractorRequest submit(IVoiceInteractor interactor, String packageName, IVoiceInteractorCallback callback) throws RemoteException { return interactor.startCommand(packageName, callback, mCommand, mArgs); @@ -721,6 +828,30 @@ public final class VoiceInteractor { return mVisualPrompt; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + if (mVisualPrompt != null && mVoicePrompts != null && mVoicePrompts.length == 1 + && mVisualPrompt.equals(mVoicePrompts[0])) { + sb.append(" "); + sb.append(mVisualPrompt); + } else { + if (mVisualPrompt != null) { + sb.append(" visual="); sb.append(mVisualPrompt); + } + if (mVoicePrompts != null) { + sb.append(", voice="); + for (int i=0; i<mVoicePrompts.length; i++) { + if (i > 0) sb.append(" | "); + sb.append(mVoicePrompts[i]); + } + } + } + sb.append('}'); + return sb.toString(); + } + /** Constructor to support Parcelable behavior. */ Prompt(Parcel in) { mVoicePrompts = in.readCharSequenceArray(); @@ -773,7 +904,7 @@ public final class VoiceInteractor { if (N < 1) { return null; } - ArrayList<Request> list = new ArrayList<Request>(N); + ArrayList<Request> list = new ArrayList<>(N); for (int i=0; i<N; i++) { list.add(mActiveRequests.valueAt(i)); } @@ -781,6 +912,7 @@ public final class VoiceInteractor { } void attachActivity(Activity activity) { + mRetaining = false; if (mActivity == activity) { return; } @@ -797,6 +929,10 @@ public final class VoiceInteractor { } } + void retainInstance() { + mRetaining = true; + } + void detachActivity() { ArrayList<Request> reqs = makeRequestList(); if (reqs != null) { @@ -807,6 +943,16 @@ public final class VoiceInteractor { req.mContext = null; } } + if (!mRetaining) { + reqs = makeRequestList(); + if (reqs != null) { + for (int i=0; i<reqs.size(); i++) { + Request req = reqs.get(i); + req.cancel(); + } + } + mActiveRequests.clear(); + } mContext = null; mActivity = null; } @@ -902,4 +1048,22 @@ public final class VoiceInteractor { throw new RuntimeException("Voice interactor has died", e); } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + String innerPrefix = prefix + " "; + if (mActiveRequests.size() > 0) { + writer.print(prefix); writer.println("Active voice requests:"); + for (int i=0; i<mActiveRequests.size(); i++) { + Request req = mActiveRequests.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(i); + writer.print(": "); + writer.println(req); + req.dump(innerPrefix, fd, writer, args); + } + } + writer.print(prefix); writer.println("VoiceInteractor misc state:"); + writer.print(prefix); writer.print(" mInteractor="); + writer.println(mInteractor.asBinder()); + writer.print(prefix); writer.print(" mActivity="); writer.println(mActivity); + } } diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 19329ceaefec..3a17e23b0547 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -1206,7 +1206,7 @@ public class IntentFilter implements Parcelable { * {@link #MATCH_CATEGORY_PORT}, {@link #NO_MATCH_DATA}. */ public final int matchDataAuthority(Uri data) { - if (mDataAuthorities == null) { + if (mDataAuthorities == null || data == null) { return NO_MATCH_DATA; } final int numDataAuthorities = mDataAuthorities.size(); @@ -1277,7 +1277,7 @@ public class IntentFilter implements Parcelable { } final ArrayList<PatternMatcher> schemeSpecificParts = mDataSchemeSpecificParts; - if (schemeSpecificParts != null) { + if (schemeSpecificParts != null && data != null) { match = hasDataSchemeSpecificPart(data.getSchemeSpecificPart()) ? MATCH_CATEGORY_SCHEME_SPECIFIC_PART : NO_MATCH_DATA; } diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl new file mode 100644 index 000000000000..d2c3d7555e70 --- /dev/null +++ b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/license/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.hardware.location; + +import android.hardware.location.IActivityRecognitionHardware; + +/** + * Activity Recognition Hardware client interface. + * This interface can be used to receive interfaces to implementations of + * {@link IActivityRecognitionHardware}. + * + * @hide + */ +interface IActivityRecognitionHardwareClient { + /** + * Hardware Activity-Recognition availability event. + * + * @param isSupported whether the platform has hardware support for the feature + * @param instance the available instance to provide access to the feature + */ + void onAvailabilityChanged(in boolean isSupported, in IActivityRecognitionHardware instance); +} diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl index 0507f5251b63..12e3117259e1 100644 --- a/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl +++ b/core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl @@ -22,6 +22,8 @@ import android.hardware.location.IActivityRecognitionHardware; * Activity Recognition Hardware watcher. This interface can be used to receive interfaces to * implementations of {@link IActivityRecognitionHardware}. * + * @deprecated use {@link IActivityRecognitionHardwareClient} instead. + * @hide */ interface IActivityRecognitionHardwareWatcher { @@ -29,4 +31,4 @@ interface IActivityRecognitionHardwareWatcher { * Hardware Activity-Recognition availability event. */ void onInstanceChanged(in IActivityRecognitionHardware instance); -}
\ No newline at end of file +} diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 86a50c6af1cc..7748fcffddb2 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -892,7 +892,6 @@ public class ConnectivityManager { * * @deprecated Deprecated in favor of the cleaner * {@link #requestNetwork(NetworkRequest, NetworkCallback)} API. - * @removed */ public int startUsingNetworkFeature(int networkType, String feature) { NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature); @@ -939,8 +938,7 @@ public class ConnectivityManager { * implementation+feature combination, except that the value {@code -1} * always indicates failure. * - * @deprecated Deprecated in favor of the cleaner {@link unregisterNetworkCallback} API. - * @removed + * @deprecated Deprecated in favor of the cleaner {@link #unregisterNetworkCallback} API. */ public int stopUsingNetworkFeature(int networkType, String feature) { NetworkCapabilities netCap = networkCapabilitiesForFeature(networkType, feature); @@ -1356,7 +1354,6 @@ public class ConnectivityManager { * @deprecated Deprecated in favor of the * {@link #requestNetwork(NetworkRequest, NetworkCallback)}, * {@link #bindProcessToNetwork} and {@link Network#getSocketFactory} API. - * @removed */ public boolean requestRouteToHost(int networkType, int hostAddress) { return requestRouteToHostAddress(networkType, NetworkUtils.intToInetAddress(hostAddress)); @@ -1375,7 +1372,6 @@ public class ConnectivityManager { * @hide * @deprecated Deprecated in favor of the {@link #requestNetwork} and * {@link #bindProcessToNetwork} API. - * @removed */ public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { try { diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index cfd5bf159671..c4de4a21e093 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -662,6 +662,17 @@ public final class LinkProperties implements Parcelable { } /** + * Returns true if this link or any of its stacked interfaces has an IPv4 address. + * + * @return {@code true} if there is an IPv4 address, {@code false} otherwise. + */ + private boolean hasIPv4AddressOnInterface(String iface) { + return (mIfaceName.equals(iface) && hasIPv4Address()) || + (iface != null && mStackedLinks.containsKey(iface) && + mStackedLinks.get(iface).hasIPv4Address()); + } + + /** * Returns true if this link has a global preferred IPv6 address. * * @return {@code true} if there is a global preferred IPv6 address, {@code false} otherwise. @@ -792,7 +803,7 @@ public final class LinkProperties implements Parcelable { if (ip instanceof Inet4Address) { // For IPv4, it suffices for now to simply have any address. - return hasIPv4Address(); + return hasIPv4AddressOnInterface(bestRoute.getInterface()); } else if (ip instanceof Inet6Address) { if (ip.isLinkLocalAddress()) { // For now, just make sure link-local destinations have diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 208085624e3b..64d6da57718f 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -80,7 +80,8 @@ public class Environment { } public File[] getExternalDirs() { - final StorageVolume[] volumes = StorageManager.getVolumeList(mUserId); + final StorageVolume[] volumes = StorageManager.getVolumeList(mUserId, + StorageManager.FLAG_FOR_WRITE); final File[] files = new File[volumes.length]; for (int i = 0; i < volumes.length; i++) { files[i] = volumes[i].getPathFile(); diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index 37ea32589374..01e1dc882474 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -758,7 +758,7 @@ public interface IMountService extends IInterface { return _result; } - public StorageVolume[] getVolumeList(int uid, String packageName) + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -767,6 +767,7 @@ public interface IMountService extends IInterface { _data.writeInterfaceToken(DESCRIPTOR); _data.writeInt(uid); _data.writeString(packageName); + _data.writeInt(flags); mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0); _reply.readException(); _result = _reply.createTypedArray(StorageVolume.CREATOR); @@ -1644,7 +1645,8 @@ public interface IMountService extends IInterface { data.enforceInterface(DESCRIPTOR); int uid = data.readInt(); String packageName = data.readString(); - StorageVolume[] result = getVolumeList(uid, packageName); + int _flags = data.readInt(); + StorageVolume[] result = getVolumeList(uid, packageName, _flags); reply.writeNoException(); reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); return true; @@ -2109,7 +2111,7 @@ public interface IMountService extends IInterface { /** * Returns list of all mountable volumes. */ - public StorageVolume[] getVolumeList(int uid, String packageName) throws RemoteException; + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException; /** * Gets the path on the filesystem for the ASEC container itself. diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index cbad78c4219f..1d92453b3e9e 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -86,6 +86,9 @@ public class StorageManager { /** {@hide} */ public static final int DEBUG_FORCE_ADOPTABLE = 1 << 0; + /** {@hide} */ + public static final int FLAG_FOR_WRITE = 1 << 0; + private final Context mContext; private final ContentResolver mResolver; @@ -812,7 +815,7 @@ public class StorageManager { /** {@hide} */ public static @Nullable StorageVolume getStorageVolume(File file, int userId) { - return getStorageVolume(getVolumeList(userId), file); + return getStorageVolume(getVolumeList(userId, 0), file); } /** {@hide} */ @@ -852,11 +855,11 @@ public class StorageManager { /** {@hide} */ public @NonNull StorageVolume[] getVolumeList() { - return getVolumeList(mContext.getUserId()); + return getVolumeList(mContext.getUserId(), 0); } /** {@hide} */ - public static @NonNull StorageVolume[] getVolumeList(int userId) { + public static @NonNull StorageVolume[] getVolumeList(int userId, int flags) { final IMountService mountService = IMountService.Stub.asInterface( ServiceManager.getService("mount")); try { @@ -877,7 +880,7 @@ public class StorageManager { if (uid <= 0) { return new StorageVolume[0]; } - return mountService.getVolumeList(uid, packageName); + return mountService.getVolumeList(uid, packageName, flags); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 8d603a17f186..ef54d84fdebf 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -46,6 +46,19 @@ import java.util.Objects; * Information about a storage volume that may be mounted. A volume may be a * partition on a physical {@link DiskInfo}, an emulated volume above some other * storage medium, or a standalone container like an ASEC or OBB. + * <p> + * Volumes may be mounted with various flags: + * <ul> + * <li>{@link #MOUNT_FLAG_PRIMARY} means the volume provides primary external + * storage, historically found at {@code /sdcard}. + * <li>{@link #MOUNT_FLAG_VISIBLE} means the volume is visible to third-party + * apps for direct filesystem access. The system should send out relevant + * storage broadcasts and index any media on visible volumes. Visible volumes + * are considered a more stable part of the device, which is why we take the + * time to index them. In particular, transient volumes like USB OTG devices + * <em>should not</em> be marked as visible; their contents should be surfaced + * to apps through the Storage Access Framework. + * </ul> * * @hide */ @@ -255,8 +268,23 @@ public class VolumeInfo implements Parcelable { return (mountFlags & MOUNT_FLAG_VISIBLE) != 0; } - public boolean isVisibleToUser(int userId) { - if (type == TYPE_PUBLIC && userId == this.mountUserId) { + public boolean isVisibleForRead(int userId) { + if (type == TYPE_PUBLIC) { + if (isPrimary() && mountUserId != userId) { + // Primary physical is only visible to single user + return false; + } else { + return isVisible(); + } + } else if (type == TYPE_EMULATED) { + return isVisible(); + } else { + return false; + } + } + + public boolean isVisibleForWrite(int userId) { + if (type == TYPE_PUBLIC && mountUserId == userId) { return isVisible(); } else if (type == TYPE_EMULATED) { return isVisible(); @@ -276,7 +304,7 @@ public class VolumeInfo implements Parcelable { public File getPathForUser(int userId) { if (path == null) { return null; - } else if (type == TYPE_PUBLIC && userId == this.mountUserId) { + } else if (type == TYPE_PUBLIC) { return new File(path); } else if (type == TYPE_EMULATED) { return new File(path, Integer.toString(userId)); @@ -306,6 +334,7 @@ public class VolumeInfo implements Parcelable { final boolean allowMassStorage = false; final String envState = reportUnmounted ? Environment.MEDIA_UNMOUNTED : getEnvironmentForState(state); + File userPath = getPathForUser(userId); if (userPath == null) { userPath = new File("/dev/null"); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index a79970c0e9c4..61c98a1a9991 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7395,6 +7395,18 @@ public final class Settings { "sms_short_codes_metadata_url"; /** + * URL for apn_db updates + * @hide + */ + public static final String APN_DB_UPDATE_CONTENT_URL = "apn_db_content_url"; + + /** + * URL for apn_db update metadata + * @hide + */ + public static final String APN_DB_UPDATE_METADATA_URL = "apn_db_metadata_url"; + + /** * URL for cert pinlist updates * @hide */ diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index f647aa6bfbe9..ec14740bd815 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -37,7 +37,9 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.RemoteException; +import android.os.UserHandle; import android.util.ArrayMap; +import android.util.DebugUtils; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; @@ -55,6 +57,8 @@ import com.android.internal.app.IVoiceInteractorRequest; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; @@ -369,6 +373,34 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + DebugUtils.buildShortClassTag(this, sb); + sb.append(" "); + sb.append(mInterface.asBinder()); + sb.append(" pkg="); + sb.append(mCallingPackage); + sb.append(" uid="); + UserHandle.formatUid(sb, mCallingUid); + sb.append('}'); + return sb.toString(); + } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mInterface="); + writer.println(mInterface.asBinder()); + writer.print(prefix); writer.print("mCallingPackage="); writer.print(mCallingPackage); + writer.print(" mCallingUid="); UserHandle.formatUid(writer, mCallingUid); + writer.println(); + writer.print(prefix); writer.print("mCallback="); + writer.println(mCallback.asBinder()); + if (mExtras != null) { + writer.print(prefix); writer.print("mExtras="); + writer.println(mExtras); + } + } } /** @@ -422,6 +454,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -504,6 +542,34 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) { sendPickOptionResult(true, selections, result); } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + if (mOptions != null) { + writer.print(prefix); writer.println("Options:"); + for (int i=0; i<mOptions.length; i++) { + VoiceInteractor.PickOptionRequest.Option op = mOptions[i]; + writer.print(prefix); writer.print(" #"); writer.print(i); writer.println(":"); + writer.print(prefix); writer.print(" mLabel="); + writer.println(op.getLabel()); + writer.print(prefix); writer.print(" mIndex="); + writer.println(op.getIndex()); + if (op.countSynonyms() > 0) { + writer.print(prefix); writer.println(" Synonyms:"); + for (int j=0; j<op.countSynonyms(); j++) { + writer.print(prefix); writer.print(" #"); writer.print(j); + writer.print(": "); writer.println(op.getSynonymAt(j)); + } + } + if (op.getExtras() != null) { + writer.print(prefix); writer.print(" mExtras="); + writer.println(op.getExtras()); + } + } + } + } } /** @@ -557,6 +623,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -607,6 +679,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall } catch (RemoteException e) { } } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mPrompt="); + writer.println(mPrompt); + } } /** @@ -661,6 +739,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall public void sendResult(Bundle result) { sendCommandResult(true, result); } + + void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + super.dump(prefix, fd, writer, args); + writer.print(prefix); writer.print("mCommand="); + writer.println(mCommand); + } } static final int MSG_START_CONFIRMATION = 1; @@ -1446,4 +1530,37 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall */ public void onCancelRequest(Request request) { } + + /** + * Print the Service's state into the given stream. This gets invoked by + * {@link VoiceInteractionSessionService} when its Service + * {@link android.app.Service#dump} method is called. + * + * @param prefix Text to print at the front of each line. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer The PrintWriter to which you should dump your state. This will be + * closed for you after you return. + * @param args additional arguments to the dump request. + */ + public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { + writer.print(prefix); writer.print("mToken="); writer.println(mToken); + writer.print(prefix); writer.print("mTheme=#"); writer.println(Integer.toHexString(mTheme)); + writer.print(prefix); writer.print("mInitialized="); writer.println(mInitialized); + writer.print(prefix); writer.print("mWindowAdded="); writer.print(mWindowAdded); + writer.print(" mWindowVisible="); writer.println(mWindowVisible); + writer.print(prefix); writer.print("mWindowWasVisible="); writer.print(mWindowWasVisible); + writer.print(" mInShowWindow="); writer.println(mInShowWindow); + if (mActiveRequests.size() > 0) { + writer.print(prefix); writer.println("Active requests:"); + String innerPrefix = prefix + " "; + for (int i=0; i<mActiveRequests.size(); i++) { + Request req = mActiveRequests.valueAt(i); + writer.print(prefix); writer.print(" #"); writer.print(i); + writer.print(": "); + writer.println(req); + req.dump(innerPrefix, fd, writer, args); + + } + } + } } diff --git a/core/java/android/service/voice/VoiceInteractionSessionService.java b/core/java/android/service/voice/VoiceInteractionSessionService.java index fb9f973ec8d7..424ff9def41c 100644 --- a/core/java/android/service/voice/VoiceInteractionSessionService.java +++ b/core/java/android/service/voice/VoiceInteractionSessionService.java @@ -30,6 +30,9 @@ import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +import java.io.FileDescriptor; +import java.io.PrintWriter; + /** * An active voice interaction session, initiated by a {@link VoiceInteractionService}. */ @@ -101,6 +104,16 @@ public abstract class VoiceInteractionSessionService extends Service { } } + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + if (mSession == null) { + writer.println("(no active session)"); + } else { + writer.println("VoiceInteractionSession:"); + mSession.dump(" ", fd, writer, args); + } + } + void doNewSession(IBinder token, Bundle args, int startFlags) { if (mSession != null) { mSession.doDestroy(); diff --git a/core/java/android/text/Hyphenator.java b/core/java/android/text/Hyphenator.java index 1ee382735d53..10a994adde2a 100644 --- a/core/java/android/text/Hyphenator.java +++ b/core/java/android/text/Hyphenator.java @@ -45,6 +45,8 @@ public class Hyphenator { @GuardedBy("sLock") final static HashMap<Locale, Hyphenator> sMap = new HashMap<Locale, Hyphenator>(); + final static Hyphenator sEmptyHyphenator = new Hyphenator(StaticLayout.nLoadHyphenator("")); + final private long mNativePtr; private Hyphenator(long nativePtr) { @@ -53,19 +55,19 @@ public class Hyphenator { public static long get(@Nullable Locale locale) { synchronized (sLock) { - if (sMap.containsKey(locale)) { - Hyphenator result = sMap.get(locale); - return (result == null) ? 0 : result.mNativePtr; + Hyphenator result = sMap.get(locale); + if (result != null) { + return result.mNativePtr; } // TODO: Convert this a proper locale-fallback system // Fall back to language-only, if available Locale languageOnlyLocale = new Locale(locale.getLanguage()); - if (sMap.containsKey(languageOnlyLocale)) { - Hyphenator result = sMap.get(languageOnlyLocale); + result = sMap.get(languageOnlyLocale); + if (result != null) { sMap.put(locale, result); - return (result == null) ? 0 : result.mNativePtr; + return result.mNativePtr; } // Fall back to script-only, if available @@ -75,16 +77,16 @@ public class Hyphenator { .setLanguage("und") .setScript(script) .build(); - if (sMap.containsKey(scriptOnlyLocale)) { - Hyphenator result = sMap.get(scriptOnlyLocale); + result = sMap.get(scriptOnlyLocale); + if (result != null) { sMap.put(locale, result); - return (result == null) ? 0 : result.mNativePtr; + return result.mNativePtr; } } - sMap.put(locale, null); // To remember we found nothing. + sMap.put(locale, sEmptyHyphenator); // To remember we found nothing. } - return 0; + return sEmptyHyphenator.mNativePtr; } private static Hyphenator loadHyphenator(String languageTag) { diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index ac98fa94975c..05fa45fc3ff2 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -147,25 +147,11 @@ public class DisplayListCanvas extends Canvas { private static native int nGetMaximumTextureWidth(); private static native int nGetMaximumTextureHeight(); - /** - * Returns the native OpenGLRenderer object. - */ - long getRenderer() { - return mNativeCanvasWrapper; - } - /////////////////////////////////////////////////////////////////////////// // Setup /////////////////////////////////////////////////////////////////////////// @Override - public void setHighContrastText(boolean highContrastText) { - nSetHighContrastText(mNativeCanvasWrapper, highContrastText); - } - - private static native void nSetHighContrastText(long renderer, boolean highContrastText); - - @Override public void insertReorderBarrier() { nInsertReorderBarrier(mNativeCanvasWrapper, true); } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 6dca26b18f26..a6639d5be78b 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -151,15 +151,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager */ Transformation mInvalidationTransformation; - // View currently under an ongoing drag + // View currently under an ongoing drag. Can be null, a child or this window. private View mCurrentDragView; // Metadata about the ongoing drag - private DragEvent mCurrentDrag; - private HashSet<View> mDragNotifiedChildren; - - // Does this group have a child that can accept the current drag payload? - private boolean mChildAcceptsDrag; + private DragEvent mCurrentDragStartEvent; + private boolean mIsInterestedInDrag; + private HashSet<View> mChildrenInterestedInDrag; // Used during drag dispatch private PointF mLocalPoint; @@ -1276,9 +1274,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } // in all cases, for drags - if (mCurrentDrag != null) { - if (newVisibility == VISIBLE) { - notifyChildOfDrag(child); + if (newVisibility == VISIBLE && mCurrentDragStartEvent != null) { + if (!mChildrenInterestedInDrag.contains(child)) { + notifyChildOfDragStart(child); } } } @@ -1386,61 +1384,66 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager mCurrentDragView = null; // Set up our tracking of drag-started notifications - mCurrentDrag = DragEvent.obtain(event); - if (mDragNotifiedChildren == null) { - mDragNotifiedChildren = new HashSet<View>(); + mCurrentDragStartEvent = DragEvent.obtain(event); + if (mChildrenInterestedInDrag == null) { + mChildrenInterestedInDrag = new HashSet<View>(); } else { - mDragNotifiedChildren.clear(); + mChildrenInterestedInDrag.clear(); } // Now dispatch down to our children, caching the responses - mChildAcceptsDrag = false; final int count = mChildrenCount; final View[] children = mChildren; for (int i = 0; i < count; i++) { final View child = children[i]; child.mPrivateFlags2 &= ~View.DRAG_MASK; if (child.getVisibility() == VISIBLE) { - final boolean handled = notifyChildOfDrag(children[i]); - if (handled) { - mChildAcceptsDrag = true; + if (notifyChildOfDragStart(children[i])) { + retval = true; } } } - // Return HANDLED if one of our children can accept the drag - if (mChildAcceptsDrag) { + // Notify itself of the drag start. + mIsInterestedInDrag = super.dispatchDragEvent(event); + if (mIsInterestedInDrag) { retval = true; } } break; case DragEvent.ACTION_DRAG_ENDED: { // Release the bookkeeping now that the drag lifecycle has ended - if (mDragNotifiedChildren != null) { - for (View child : mDragNotifiedChildren) { - // If a child was notified about an ongoing drag, it's told that it's over - child.dispatchDragEvent(event); + if (mChildrenInterestedInDrag != null) { + for (View child : mChildrenInterestedInDrag) { + // If a child was interested in the ongoing drag, it's told that it's over + if (child.dispatchDragEvent(event)) { + retval = true; + } child.mPrivateFlags2 &= ~View.DRAG_MASK; child.refreshDrawableState(); } - mDragNotifiedChildren.clear(); - if (mCurrentDrag != null) { - mCurrentDrag.recycle(); - mCurrentDrag = null; + mChildrenInterestedInDrag.clear(); + if (mCurrentDragStartEvent != null) { + mCurrentDragStartEvent.recycle(); + mCurrentDragStartEvent = null; } } - // We consider drag-ended to have been handled if one of our children - // had offered to handle the drag. - if (mChildAcceptsDrag) { - retval = true; + if (mIsInterestedInDrag) { + if (super.dispatchDragEvent(event)) { + retval = true; + } + mIsInterestedInDrag = false; } } break; case DragEvent.ACTION_DRAG_LOCATION: { // Find the [possibly new] drag target - final View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint); + View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint); + if (target == null && mIsInterestedInDrag) { + target = this; + } // If we've changed apparent drag target, tell the view root which view // we're over now [for purposes of the eventual drag-recipient-changed @@ -1452,35 +1455,49 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager root.setDragFocus(target); final int action = event.mAction; - // If we've dragged off of a child view, send it the EXITED message + // If we've dragged off of a child view or this window, send it the EXITED message if (mCurrentDragView != null) { final View view = mCurrentDragView; event.mAction = DragEvent.ACTION_DRAG_EXITED; - view.dispatchDragEvent(event); - view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; - view.refreshDrawableState(); + if (view != this) { + view.dispatchDragEvent(event); + view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; + view.refreshDrawableState(); + } else { + super.dispatchDragEvent(event); + } } + mCurrentDragView = target; - // If we've dragged over a new child view, send it the ENTERED message + // If we've dragged over a new child view, send it the ENTERED message, otherwise + // send it to this window. if (target != null) { event.mAction = DragEvent.ACTION_DRAG_ENTERED; - target.dispatchDragEvent(event); - target.mPrivateFlags2 |= View.PFLAG2_DRAG_HOVERED; - target.refreshDrawableState(); + if (target != this) { + target.dispatchDragEvent(event); + target.mPrivateFlags2 |= View.PFLAG2_DRAG_HOVERED; + target.refreshDrawableState(); + } else { + super.dispatchDragEvent(event); + } } event.mAction = action; // restore the event's original state } // Dispatch the actual drag location notice, localized into its coordinates if (target != null) { - event.mX = localPoint.x; - event.mY = localPoint.y; + if (target != this) { + event.mX = localPoint.x; + event.mY = localPoint.y; - retval = target.dispatchDragEvent(event); + retval = target.dispatchDragEvent(event); - event.mX = tx; - event.mY = ty; + event.mX = tx; + event.mY = ty; + } else { + retval = super.dispatchDragEvent(event); + } } } break; @@ -1490,6 +1507,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * that we're about to get the corresponding LOCATION event, which we will use to * determine which of our children is the new target; at that point we will * push a DRAG_ENTERED down to the new target child [which may itself be a ViewGroup]. + * If no suitable child is detected, dispatch to this window. * * DRAG_EXITED *is* dispatched all the way down immediately: once we know the * drag has left this ViewGroup, we know by definition that every contained subview @@ -1499,9 +1517,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager case DragEvent.ACTION_DRAG_EXITED: { if (mCurrentDragView != null) { final View view = mCurrentDragView; - view.dispatchDragEvent(event); - view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; - view.refreshDrawableState(); + if (view != this) { + view.dispatchDragEvent(event); + view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; + view.refreshDrawableState(); + } else { + super.dispatchDragEvent(event); + } mCurrentDragView = null; } @@ -1517,6 +1539,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager retval = target.dispatchDragEvent(event); event.mX = tx; event.mY = ty; + } else if (mIsInterestedInDrag) { + retval = super.dispatchDragEvent(event); } else { if (ViewDebug.DEBUG_DRAG) { Log.d(View.VIEW_LOG_TAG, " not dropped on an accepting view"); @@ -1525,11 +1549,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } break; } - // If none of our children could handle the event, try here - if (!retval) { - // Call up to the View implementation that dispatches to installed listeners - retval = super.dispatchDragEvent(event); - } return retval; } @@ -1551,16 +1570,17 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return null; } - boolean notifyChildOfDrag(View child) { + boolean notifyChildOfDragStart(View child) { + // The caller guarantees that the child is not in mChildrenInterestedInDrag yet. + if (ViewDebug.DEBUG_DRAG) { Log.d(View.VIEW_LOG_TAG, "Sending drag-started to view: " + child); } - boolean canAccept = false; - if (! mDragNotifiedChildren.contains(child)) { - mDragNotifiedChildren.add(child); - canAccept = child.dispatchDragEvent(mCurrentDrag); - if (canAccept && !child.canAcceptDrag()) { + final boolean canAccept = child.dispatchDragEvent(mCurrentDragStartEvent); + if (canAccept) { + mChildrenInterestedInDrag.add(child); + if (!child.canAcceptDrag()) { child.mPrivateFlags2 |= View.PFLAG2_DRAG_CAN_ACCEPT; child.refreshDrawableState(); } @@ -3005,10 +3025,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager mLayoutCalledWhileSuppressed = false; // Tear down our drag tracking - mDragNotifiedChildren = null; - if (mCurrentDrag != null) { - mCurrentDrag.recycle(); - mCurrentDrag = null; + mChildrenInterestedInDrag = null; + mIsInterestedInDrag = false; + if (mCurrentDragStartEvent != null) { + mCurrentDragStartEvent.recycle(); + mCurrentDragStartEvent = null; } final int count = mChildrenCount; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1f86d0db02db..fdfc48a523f2 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -548,11 +548,6 @@ public final class ViewRootImpl implements ViewParent, mPendingContentInsets.set(mAttachInfo.mContentInsets); mPendingStableInsets.set(mAttachInfo.mStableInsets); mPendingVisibleInsets.set(0, 0, 0, 0); - try { - relayoutWindow(attrs, getHostVisibility(), false); - } catch (RemoteException e) { - if (DEBUG_LAYOUT) Log.e(TAG, "failed to relayoutWindow", e); - } if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow); if (res < WindowManagerGlobal.ADD_OKAY) { mAttachInfo.mRootView = null; diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index be564f84d221..aaf605274a9a 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -995,6 +995,12 @@ public interface WindowManagerPolicy { public void screenTurningOn(ScreenOnListener screenOnListener); /** + * Called when the device has actually turned on the screen, i.e. the display power state has + * been set to ON and the screen is unblocked. + */ + public void screenTurnedOn(); + + /** * Called when the device has turned the screen off. */ public void screenTurnedOff(); diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index e169cebb196a..010cb27dbc71 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -4060,9 +4060,17 @@ public class Editor { private float mPrevX; // Indicates if the handle has moved a boundary between LTR and RTL text. private boolean mLanguageDirectionChanged = false; + // Distance from edge of horizontally scrolling text view + // to use to switch to character mode. + private final float mTextViewEdgeSlop; + // Used to save text view location. + private final int[] mTextViewLocation = new int[2]; public SelectionStartHandleView(Drawable drawableLtr, Drawable drawableRtl) { super(drawableLtr, drawableRtl); + ViewConfiguration viewConfiguration = ViewConfiguration.get( + mTextView.getContext()); + mTextViewEdgeSlop = viewConfiguration.getScaledTouchSlop() * 4; } @Override @@ -4100,7 +4108,7 @@ public class Editor { if (layout == null) { // HandleView will deal appropriately in positionAtCursorOffset when // layout is null. - positionAtCursorOffset(mTextView.getOffsetForPosition(x, y), false); + positionAndAdjustForCrossingHandles(mTextView.getOffsetForPosition(x, y)); return; } @@ -4142,12 +4150,12 @@ public class Editor { // to the current position. mLanguageDirectionChanged = true; mTouchWordDelta = 0.0f; - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); return; } else if (mLanguageDirectionChanged && !isLvlBoundary) { // We've just moved past the boundary so update the position. After this we can // figure out if the user is expanding or shrinking to go by word or character. - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); mTouchWordDelta = 0.0f; mLanguageDirectionChanged = false; return; @@ -4160,6 +4168,21 @@ public class Editor { } } + if (mTextView.getHorizontallyScrolling()) { + if (positionNearEdgeOfScrollingView(x, atRtl) + && (mTextView.getScrollX() != 0) + && ((isExpanding && offset < selectionStart) || !isExpanding)) { + // If we're expanding ensure that the offset is smaller than the + // selection start, if the handle snapped to the word, the finger position + // may be out of sync and we don't want the selection to jump back. + mTouchWordDelta = 0.0f; + final int nextOffset = atRtl ? layout.getOffsetToRightOf(mPreviousOffset) + : layout.getOffsetToLeftOf(mPreviousOffset); + positionAndAdjustForCrossingHandles(nextOffset); + return; + } + } + if (isExpanding) { // User is increasing the selection. if (!mInWord || currLine < mPrevLine) { @@ -4215,17 +4238,22 @@ public class Editor { } if (positionCursor) { - // Handles can not cross and selection is at least one character. - if (offset >= selectionEnd) { - offset = getNextCursorOffset(selectionEnd, false); - mTouchWordDelta = 0.0f; - } mPreviousLineTouched = currLine; - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); } mPrevX = x; } + private void positionAndAdjustForCrossingHandles(int offset) { + final int selectionEnd = mTextView.getSelectionEnd(); + if (offset >= selectionEnd) { + // Handles can not cross and selection is at least one character. + offset = getNextCursorOffset(selectionEnd, false); + mTouchWordDelta = 0.0f; + } + positionAtCursorOffset(offset, false); + } + @Override protected void positionAtCursorOffset(int offset, boolean parentScrolled) { super.positionAtCursorOffset(offset, parentScrolled); @@ -4243,6 +4271,20 @@ public class Editor { } return superResult; } + + private boolean positionNearEdgeOfScrollingView(float x, boolean atRtl) { + mTextView.getLocationOnScreen(mTextViewLocation); + boolean nearEdge; + if (atRtl) { + int rightEdge = mTextViewLocation[0] + mTextView.getWidth() + - mTextView.getPaddingRight(); + nearEdge = x > rightEdge - mTextViewEdgeSlop; + } else { + int leftEdge = mTextViewLocation[0] + mTextView.getPaddingLeft(); + nearEdge = x < leftEdge + mTextViewEdgeSlop; + } + return nearEdge; + } } private class SelectionEndHandleView extends HandleView { @@ -4254,9 +4296,17 @@ public class Editor { private float mPrevX; // Indicates if the handle has moved a boundary between LTR and RTL text. private boolean mLanguageDirectionChanged = false; + // Distance from edge of horizontally scrolling text view + // to use to switch to character mode. + private final float mTextViewEdgeSlop; + // Used to save the text view location. + private final int[] mTextViewLocation = new int[2]; public SelectionEndHandleView(Drawable drawableLtr, Drawable drawableRtl) { super(drawableLtr, drawableRtl); + ViewConfiguration viewConfiguration = ViewConfiguration.get( + mTextView.getContext()); + mTextViewEdgeSlop = viewConfiguration.getScaledTouchSlop() * 4; } @Override @@ -4294,7 +4344,7 @@ public class Editor { if (layout == null) { // HandleView will deal appropriately in positionAtCursorOffset when // layout is null. - positionAtCursorOffset(mTextView.getOffsetForPosition(x, y), false); + positionAndAdjustForCrossingHandles(mTextView.getOffsetForPosition(x, y)); return; } @@ -4336,12 +4386,12 @@ public class Editor { // to the current position. mLanguageDirectionChanged = true; mTouchWordDelta = 0.0f; - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); return; } else if (mLanguageDirectionChanged && !isLvlBoundary) { // We've just moved past the boundary so update the position. After this we can // figure out if the user is expanding or shrinking to go by word or character. - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); mTouchWordDelta = 0.0f; mLanguageDirectionChanged = false; return; @@ -4354,6 +4404,21 @@ public class Editor { } } + if (mTextView.getHorizontallyScrolling()) { + if (positionNearEdgeOfScrollingView(x, atRtl) + && mTextView.canScrollHorizontally(atRtl ? -1 : 1) + && ((isExpanding && offset > selectionEnd) || !isExpanding)) { + // If we're expanding ensure that the offset is actually greater than the + // selection end, if the handle snapped to the word, the finger position + // may be out of sync and we don't want the selection to jump back. + mTouchWordDelta = 0.0f; + final int nextOffset = atRtl ? layout.getOffsetToLeftOf(mPreviousOffset) + : layout.getOffsetToRightOf(mPreviousOffset); + positionAndAdjustForCrossingHandles(nextOffset); + return; + } + } + if (isExpanding) { // User is increasing the selection. if (!mInWord || currLine > mPrevLine) { @@ -4409,17 +4474,22 @@ public class Editor { } if (positionCursor) { - // Handles can not cross and selection is at least one character. - if (offset <= selectionStart) { - offset = getNextCursorOffset(selectionStart, true); - mTouchWordDelta = 0.0f; - } mPreviousLineTouched = currLine; - positionAtCursorOffset(offset, false); + positionAndAdjustForCrossingHandles(offset); } mPrevX = x; } + private void positionAndAdjustForCrossingHandles(int offset) { + final int selectionStart = mTextView.getSelectionStart(); + if (offset <= selectionStart) { + // Handles can not cross and selection is at least one character. + offset = getNextCursorOffset(selectionStart, true); + mTouchWordDelta = 0.0f; + } + positionAtCursorOffset(offset, false); + } + @Override protected void positionAtCursorOffset(int offset, boolean parentScrolled) { super.positionAtCursorOffset(offset, parentScrolled); @@ -4437,6 +4507,20 @@ public class Editor { } return superResult; } + + private boolean positionNearEdgeOfScrollingView(float x, boolean atRtl) { + mTextView.getLocationOnScreen(mTextViewLocation); + boolean nearEdge; + if (atRtl) { + int leftEdge = mTextViewLocation[0] + mTextView.getPaddingLeft(); + nearEdge = x < leftEdge + mTextViewEdgeSlop; + } else { + int rightEdge = mTextViewLocation[0] + mTextView.getWidth() + - mTextView.getPaddingRight(); + nearEdge = x > rightEdge - mTextViewEdgeSlop; + } + return nearEdge; + } } private int getCurrentLineAdjustedForSlop(Layout layout, int prevLine, float y) { diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 1bf17e6843ba..89599e089f75 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -500,7 +500,7 @@ public class ResolverActivity extends Activity { mPackageMonitor.unregister(); mRegistered = false; } - if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { + if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && !isVoiceInteraction()) { // This resolver is in the unusual situation where it has been // launched at the top of a new task. We don't let it be added // to the recent tasks shown to the user, and we need to make sure @@ -810,8 +810,13 @@ public class ResolverActivity extends Activity { void configureContentView(List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { + // The last argument of createAdapter is whether to do special handling + // of the last used choice to highlight it in the list. We need to always + // turn this off when running under voice interaction, since it results in + // a more complicated UI that the current voice interaction flow is not able + // to handle. mAdapter = createAdapter(this, payloadIntents, initialIntents, rList, - mLaunchedFromUid, alwaysUseOption); + mLaunchedFromUid, alwaysUseOption && !isVoiceInteraction()); final int layoutId; if (mAdapter.hasFilteredItem()) { diff --git a/core/java/com/android/internal/midi/MidiConstants.java b/core/java/com/android/internal/midi/MidiConstants.java index c13e5fcca839..b6b8bf0a34b6 100644 --- a/core/java/com/android/internal/midi/MidiConstants.java +++ b/core/java/com/android/internal/midi/MidiConstants.java @@ -55,18 +55,30 @@ public final class MidiConstants { public final static int SYSTEM_BYTE_LENGTHS[] = { 1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; - /********************************************************************/ - public static int getBytesPerMessage(int command) { - if ((command < 0x80) || (command > 0xFF)) { - return 0; - } else if (command >= 0xF0) { - return SYSTEM_BYTE_LENGTHS[command & 0x0F]; + /** + * MIDI messages, except for SysEx, are 1,2 or 3 bytes long. + * You can tell how long a MIDI message is from the first status byte. + * Do not call this for SysEx, which has variable length. + * @param statusByte + * @return number of bytes in a complete message or zero if data byte passed + */ + public static int getBytesPerMessage(byte statusByte) { + // Java bytes are signed so we need to mask off the high bits + // to get a value between 0 and 255. + int statusInt = statusByte & 0xFF; + if (statusInt >= 0xF0) { + // System messages use low nibble for size. + return SYSTEM_BYTE_LENGTHS[statusInt & 0x0F]; + } else if(statusInt >= 0x80) { + // Channel voice messages use high nibble for size. + return CHANNEL_BYTE_LENGTHS[(statusInt >> 4) - 8]; } else { - return CHANNEL_BYTE_LENGTHS[(command >> 4) - 8]; + return 0; // data byte } } + /** * @param msg * @param offset diff --git a/core/java/com/android/internal/midi/MidiFramer.java b/core/java/com/android/internal/midi/MidiFramer.java index 058f57cff38c..62517fa82953 100644 --- a/core/java/com/android/internal/midi/MidiFramer.java +++ b/core/java/com/android/internal/midi/MidiFramer.java @@ -17,7 +17,7 @@ package com.android.internal.midi; import android.media.midi.MidiReceiver; -import android.util.Log; +//import android.util.Log; import java.io.IOException; @@ -37,7 +37,7 @@ public class MidiFramer extends MidiReceiver { private MidiReceiver mReceiver; private byte[] mBuffer = new byte[3]; private int mCount; - private int mRunningStatus; + private byte mRunningStatus; private int mNeeded; private boolean mInSysEx; @@ -59,22 +59,22 @@ public class MidiFramer extends MidiReceiver { @Override public void onSend(byte[] data, int offset, int count, long timestamp) throws IOException { - // Log.i(TAG, formatMidiData(data, offset, count)); int sysExStartOffset = (mInSysEx ? offset : -1); for (int i = 0; i < count; i++) { - int b = data[offset] & 0xFF; - if (b >= 0x80) { // status byte? - if (b < 0xF0) { // channel message? - mRunningStatus = (byte) b; + final byte currentByte = data[offset]; + final int currentInt = currentByte & 0xFF; + if (currentInt >= 0x80) { // status byte? + if (currentInt < 0xF0) { // channel message? + mRunningStatus = currentByte; mCount = 1; - mNeeded = MidiConstants.getBytesPerMessage(b) - 1; - } else if (b < 0xF8) { // system common? - if (b == 0xF0 /* SysEx Start */) { + mNeeded = MidiConstants.getBytesPerMessage(currentByte) - 1; + } else if (currentInt < 0xF8) { // system common? + if (currentInt == 0xF0 /* SysEx Start */) { // Log.i(TAG, "SysEx Start"); mInSysEx = true; sysExStartOffset = offset; - } else if (b == 0xF7 /* SysEx End */) { + } else if (currentInt == 0xF7 /* SysEx End */) { // Log.i(TAG, "SysEx End"); if (mInSysEx) { mReceiver.send(data, sysExStartOffset, @@ -83,10 +83,10 @@ public class MidiFramer extends MidiReceiver { sysExStartOffset = -1; } } else { - mBuffer[0] = (byte) b; + mBuffer[0] = currentByte; mRunningStatus = 0; mCount = 1; - mNeeded = MidiConstants.getBytesPerMessage(b) - 1; + mNeeded = MidiConstants.getBytesPerMessage(currentByte) - 1; } } else { // real-time? // Single byte message interleaved with other data. @@ -98,12 +98,11 @@ public class MidiFramer extends MidiReceiver { mReceiver.send(data, offset, 1, timestamp); } } else { // data byte - // Save SysEx data for SysEx End marker or end of buffer. if (!mInSysEx) { - mBuffer[mCount++] = (byte) b; + mBuffer[mCount++] = currentByte; if (--mNeeded == 0) { if (mRunningStatus != 0) { - mBuffer[0] = (byte) mRunningStatus; + mBuffer[0] = mRunningStatus; } mReceiver.send(mBuffer, 0, mCount, timestamp); mNeeded = MidiConstants.getBytesPerMessage(mBuffer[0]) - 1; diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 9caf78a6b3a3..f178c8cf7ece 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -126,6 +126,9 @@ public final class BatteryStatsHelper { PowerCalculator mCameraPowerCalculator; PowerCalculator mFlashlightPowerCalculator; + boolean mHasWifiPowerReporting = false; + boolean mHasBluetoothPowerReporting = false; + public static boolean checkWifiOnly(Context context) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService( Context.CONNECTIVITY_SERVICE); @@ -349,21 +352,23 @@ public final class BatteryStatsHelper { } mMobileRadioPowerCalculator.reset(mStats); - if (mWifiPowerCalculator == null) { - if (checkHasWifiPowerReporting(mStats, mPowerProfile)) { - mWifiPowerCalculator = new WifiPowerCalculator(mPowerProfile); - } else { - mWifiPowerCalculator = new WifiPowerEstimator(mPowerProfile); - } + // checkHasWifiPowerReporting can change if we get energy data at a later point, so + // always check this field. + final boolean hasWifiPowerReporting = checkHasWifiPowerReporting(mStats, mPowerProfile); + if (mWifiPowerCalculator == null || hasWifiPowerReporting != mHasWifiPowerReporting) { + mWifiPowerCalculator = hasWifiPowerReporting ? + new WifiPowerCalculator(mPowerProfile) : + new WifiPowerEstimator(mPowerProfile); + mHasWifiPowerReporting = hasWifiPowerReporting; } mWifiPowerCalculator.reset(); - if (mBluetoothPowerCalculator == null) { - if (checkHasBluetoothPowerReporting(mStats, mPowerProfile)) { - mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); - } else { - mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); - } + final boolean hasBluetoothPowerReporting = checkHasBluetoothPowerReporting(mStats, + mPowerProfile); + if (mBluetoothPowerCalculator == null || + hasBluetoothPowerReporting != mHasBluetoothPowerReporting) { + mBluetoothPowerCalculator = new BluetoothPowerCalculator(mPowerProfile); + mHasBluetoothPowerReporting = hasBluetoothPowerReporting; } mBluetoothPowerCalculator.reset(); diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 79af4522b425..e330de24f6d6 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -64,6 +64,16 @@ oneway interface IKeyguardService { */ void onScreenTurningOn(IKeyguardDrawnCallback callback); + /** + * Called when the screen has actually turned on. + */ + void onScreenTurnedOn(); + + /** + * Called when the screen has turned off. + */ + void onScreenTurnedOff(); + void setKeyguardEnabled(boolean enabled); void onSystemReady(); void doKeyguardTimeout(in Bundle options); diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index 444f878caac0..a709bb8e1b07 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -23,10 +23,10 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.CanvasProperty; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; -import android.graphics.RectF; import android.media.AudioManager; import android.os.Bundle; import android.os.Debug; @@ -38,8 +38,10 @@ import android.provider.Settings; import android.util.AttributeSet; import android.util.IntArray; import android.util.Log; +import android.view.DisplayListCanvas; import android.view.HapticFeedbackConstants; import android.view.MotionEvent; +import android.view.RenderNodeAnimator; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -200,10 +202,16 @@ public class LockPatternView extends View { } public static class CellState { - public float scale = 1.0f; - public float translateY = 0.0f; - public float alpha = 1.0f; - public float size; + int row; + int col; + boolean hwAnimating; + CanvasProperty<Float> hwRadius; + CanvasProperty<Float> hwCenterX; + CanvasProperty<Float> hwCenterY; + CanvasProperty<Paint> hwPaint; + float radius; + float translationY; + float alpha = 1f; public float lineEndX = Float.MIN_VALUE; public float lineEndY = Float.MIN_VALUE; public ValueAnimator lineAnimator; @@ -313,7 +321,9 @@ public class LockPatternView extends View { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { mCellStates[i][j] = new CellState(); - mCellStates[i][j].size = mDotSize; + mCellStates[i][j].radius = mDotSize/2; + mCellStates[i][j].row = i; + mCellStates[i][j].col = j; } } @@ -412,6 +422,112 @@ public class LockPatternView extends View { invalidate(); } + public void startCellStateAnimation(CellState cellState, float startAlpha, float endAlpha, + float startTranslationY, float endTranslationY, float startScale, float endScale, + long delay, long duration, + Interpolator interpolator, Runnable finishRunnable) { + if (isHardwareAccelerated()) { + startCellStateAnimationHw(cellState, startAlpha, endAlpha, startTranslationY, + endTranslationY, startScale, endScale, delay, duration, interpolator, + finishRunnable); + } else { + startCellStateAnimationSw(cellState, startAlpha, endAlpha, startTranslationY, + endTranslationY, startScale, endScale, delay, duration, interpolator, + finishRunnable); + } + } + + private void startCellStateAnimationSw(final CellState cellState, + final float startAlpha, final float endAlpha, + final float startTranslationY, final float endTranslationY, + final float startScale, final float endScale, + long delay, long duration, Interpolator interpolator, final Runnable finishRunnable) { + cellState.alpha = startAlpha; + cellState.translationY = startTranslationY; + cellState.radius = mDotSize/2 * startScale; + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); + animator.setDuration(duration); + animator.setStartDelay(delay); + animator.setInterpolator(interpolator); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float t = (float) animation.getAnimatedValue(); + cellState.alpha = (1 - t) * startAlpha + t * endAlpha; + cellState.translationY = (1 - t) * startTranslationY + t * endTranslationY; + cellState.radius = mDotSize/2 * ((1 - t) * startScale + t * endScale); + invalidate(); + } + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (finishRunnable != null) { + finishRunnable.run(); + } + } + }); + animator.start(); + } + + private void startCellStateAnimationHw(final CellState cellState, + float startAlpha, float endAlpha, + float startTranslationY, float endTranslationY, + float startScale, float endScale, + long delay, long duration, Interpolator interpolator, final Runnable finishRunnable) { + cellState.alpha = endAlpha; + cellState.translationY = endTranslationY; + cellState.radius = mDotSize/2 * endScale; + cellState.hwAnimating = true; + cellState.hwCenterY = CanvasProperty.createFloat( + getCenterYForRow(cellState.row) + startTranslationY); + cellState.hwCenterX = CanvasProperty.createFloat(getCenterXForColumn(cellState.col)); + cellState.hwRadius = CanvasProperty.createFloat(mDotSize/2 * startScale); + mPaint.setColor(getCurrentColor(false)); + mPaint.setAlpha((int) (startAlpha * 255)); + cellState.hwPaint = CanvasProperty.createPaint(new Paint(mPaint)); + + startRtFloatAnimation(cellState.hwCenterY, + getCenterYForRow(cellState.row) + endTranslationY, delay, duration, interpolator); + startRtFloatAnimation(cellState.hwRadius, mDotSize/2 * endScale, delay, duration, + interpolator); + startRtAlphaAnimation(cellState, endAlpha, delay, duration, interpolator, + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + cellState.hwAnimating = false; + if (finishRunnable != null) { + finishRunnable.run(); + } + } + }); + + invalidate(); + } + + private void startRtAlphaAnimation(CellState cellState, float endAlpha, + long delay, long duration, Interpolator interpolator, + Animator.AnimatorListener listener) { + RenderNodeAnimator animator = new RenderNodeAnimator(cellState.hwPaint, + RenderNodeAnimator.PAINT_ALPHA, (int) (endAlpha * 255)); + animator.setDuration(duration); + animator.setStartDelay(delay); + animator.setInterpolator(interpolator); + animator.setTarget(this); + animator.addListener(listener); + animator.start(); + } + + private void startRtFloatAnimation(CanvasProperty<Float> property, float endValue, + long delay, long duration, Interpolator interpolator) { + RenderNodeAnimator animator = new RenderNodeAnimator(property, endValue); + animator.setDuration(duration); + animator.setStartDelay(delay); + animator.setInterpolator(interpolator); + animator.setTarget(this); + animator.start(); + } + private void notifyCellAdded() { // sendAccessEvent(R.string.lockscreen_access_pattern_cell_added); if (mOnPatternListener != null) { @@ -603,14 +719,15 @@ public class LockPatternView extends View { private void startCellActivatedAnimation(Cell cell) { final CellState cellState = mCellStates[cell.row][cell.column]; - startSizeAnimation(mDotSize, mDotSizeActivated, 96, mLinearOutSlowInInterpolator, + startRadiusAnimation(mDotSize/2, mDotSizeActivated/2, 96, mLinearOutSlowInInterpolator, cellState, new Runnable() { - @Override - public void run() { - startSizeAnimation(mDotSizeActivated, mDotSize, 192, mFastOutSlowInInterpolator, - cellState, null); - } - }); + @Override + public void run() { + startRadiusAnimation(mDotSizeActivated/2, mDotSize/2, 192, + mFastOutSlowInInterpolator, + cellState, null); + } + }); startLineEndAnimation(cellState, mInProgressX, mInProgressY, getCenterXForColumn(cell.column), getCenterYForRow(cell.row)); } @@ -639,13 +756,13 @@ public class LockPatternView extends View { state.lineAnimator = valueAnimator; } - private void startSizeAnimation(float start, float end, long duration, Interpolator interpolator, - final CellState state, final Runnable endRunnable) { + private void startRadiusAnimation(float start, float end, long duration, + Interpolator interpolator, final CellState state, final Runnable endRunnable) { ValueAnimator valueAnimator = ValueAnimator.ofFloat(start, end); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { - state.size = (float) animation.getAnimatedValue(); + state.radius = (float) animation.getAnimatedValue(); invalidate(); } }); @@ -969,10 +1086,16 @@ public class LockPatternView extends View { for (int j = 0; j < 3; j++) { CellState cellState = mCellStates[i][j]; float centerX = getCenterXForColumn(j); - float size = cellState.size * cellState.scale; - float translationY = cellState.translateY; - drawCircle(canvas, (int) centerX, (int) centerY + translationY, - size, drawLookup[i][j], cellState.alpha); + float translationY = cellState.translationY; + if (isHardwareAccelerated() && cellState.hwAnimating) { + DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; + displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY, + cellState.hwRadius, cellState.hwPaint); + } else { + drawCircle(canvas, (int) centerX, (int) centerY + translationY, + cellState.radius, drawLookup[i][j], cellState.alpha); + + } } } @@ -1055,11 +1178,11 @@ public class LockPatternView extends View { /** * @param partOfPattern Whether this circle is part of the pattern. */ - private void drawCircle(Canvas canvas, float centerX, float centerY, float size, + private void drawCircle(Canvas canvas, float centerX, float centerY, float radius, boolean partOfPattern, float alpha) { mPaint.setColor(getCurrentColor(partOfPattern)); mPaint.setAlpha((int) (alpha * 255)); - canvas.drawCircle(centerX, centerY, size/2, mPaint); + canvas.drawCircle(centerX, centerY, radius, mPaint); } @Override @@ -1290,7 +1413,6 @@ public class LockPatternView extends View { float centerY = getCenterYForRow(row); float cellheight = mSquareHeight * mHitFactor * 0.5f; float cellwidth = mSquareWidth * mHitFactor * 0.5f; - float translationY = cell.translateY; bounds.left = (int) (centerX - cellwidth); bounds.right = (int) (centerX + cellwidth); bounds.top = (int) (centerY - cellheight); diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 0d80a7f9fbe2..670d3c01e030 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -475,6 +475,14 @@ static void FromColor_D4444_Raw(void* dst, const SkColor src[], int width, } } +static void FromColor_DA8(void* dst, const SkColor src[], int width, int x, int y) { + uint8_t* d = (uint8_t*)dst; + + for (int stop = x + width; x < stop; x++) { + *d++ = SkColorGetA(*src++); + } +} + // can return NULL static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { switch (bitmap.colorType()) { @@ -485,6 +493,8 @@ static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) { FromColor_D4444_Raw; case kRGB_565_SkColorType: return FromColor_D565; + case kAlpha_8_SkColorType: + return FromColor_DA8; default: break; } @@ -632,6 +642,15 @@ static void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width, } while (--width != 0); } +static void ToColor_SA8(SkColor dst[], const void* src, int width, SkColorTable*) { + SkASSERT(width > 0); + const uint8_t* s = (const uint8_t*)src; + do { + uint8_t c = *s++; + *dst++ = SkColorSetARGB(c, c, c, c); + } while (--width != 0); +} + // can return NULL static ToColorProc ChooseToColorProc(const SkBitmap& src) { switch (src.colorType()) { @@ -673,6 +692,8 @@ static ToColorProc ChooseToColorProc(const SkBitmap& src) { default: return NULL; } + case kAlpha_8_SkColorType: + return ToColor_SA8; default: break; } diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp index d28669a35492..38db76b0b183 100644 --- a/core/jni/android/graphics/FontFamily.cpp +++ b/core/jni/android/graphics/FontFamily.cpp @@ -84,7 +84,7 @@ static jboolean FontFamily_addFontWeightStyle(JNIEnv* env, jobject clazz, jlong return true; } -static void releaseAsset(const void* ptr, size_t length, void* context) { +static void releaseAsset(const void* ptr, void* context) { delete static_cast<Asset*>(context); } diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index 1f0145315fc1..43825adc7a80 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -69,6 +69,11 @@ static jint getHeight(JNIEnv*, jobject, jlong canvasHandle) { return static_cast<jint>(get_canvas(canvasHandle)->height()); } +static void setHighContrastText(JNIEnv*, jobject, jlong canvasHandle, jboolean highContrastText) { + Canvas* canvas = get_canvas(canvasHandle); + canvas->setHighContrastText(highContrastText); +} + static jint getSaveCount(JNIEnv*, jobject, jlong canvasHandle) { return static_cast<jint>(get_canvas(canvasHandle)->getSaveCount()); } @@ -430,6 +435,16 @@ static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbi vertA.ptr(), colorA.ptr(), paint); } +static void simplifyPaint(int color, SkPaint* paint) { + paint->setColor(color); + paint->setShader(nullptr); + paint->setColorFilter(nullptr); + paint->setLooper(nullptr); + paint->setStrokeWidth(4 + 0.04 * paint->getTextSize()); + paint->setStrokeJoin(SkPaint::kRound_Join); + paint->setLooper(nullptr); +} + class DrawTextFunctor { public: DrawTextFunctor(const Layout& layout, Canvas* canvas, uint16_t* glyphs, float* pos, @@ -454,9 +469,32 @@ public: } size_t glyphCount = end - start; - canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y, - bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, - totalAdvance); + + if (CC_UNLIKELY(canvas->isHighContrastText())) { + // high contrast draw path + int color = paint.getColor(); + int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color); + bool darken = channelSum < (128 * 3); + + // outline + SkPaint outlinePaint(paint); + simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint); + outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style); + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, outlinePaint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); + + // inner + SkPaint innerPaint(paint); + simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, &innerPaint); + innerPaint.setStyle(SkPaint::kFill_Style); + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, innerPaint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); + } else { + // standard draw path + canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y, + bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, + totalAdvance); + } } private: const Layout& layout; @@ -679,6 +717,7 @@ static JNINativeMethod gMethods[] = { {"native_isOpaque","(J)Z", (void*) CanvasJNI::isOpaque}, {"native_getWidth","(J)I", (void*) CanvasJNI::getWidth}, {"native_getHeight","(J)I", (void*) CanvasJNI::getHeight}, + {"native_setHighContrastText","(JZ)V", (void*) CanvasJNI::setHighContrastText}, {"native_save","(JI)I", (void*) CanvasJNI::save}, {"native_saveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer}, {"native_saveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha}, diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index 995d39f33fbb..ba08237d9843 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -//#define LOG_NDEBUG 0 +#define LOG_NDEBUG 0 #define LOG_TAG "DngCreator_JNI" #include <inttypes.h> #include <string.h> @@ -26,6 +26,7 @@ #include <utils/StrongPointer.h> #include <utils/RefBase.h> #include <utils/Vector.h> +#include <utils/String8.h> #include <cutils/properties.h> #include <system/camera_metadata.h> #include <camera/CameraMetadata.h> @@ -48,13 +49,22 @@ using namespace android; using namespace img_utils; -#define BAIL_IF_INVALID(expr, jnienv, tagId, writer) \ +#define BAIL_IF_INVALID_RET_BOOL(expr, jnienv, tagId, writer) \ if ((expr) != OK) { \ jniThrowExceptionFmt(jnienv, "java/lang/IllegalArgumentException", \ "Invalid metadata for tag %s (%x)", (writer)->getTagName(tagId), (tagId)); \ - return; \ + return false; \ } + +#define BAIL_IF_INVALID_RET_NULL_SP(expr, jnienv, tagId, writer) \ + if ((expr) != OK) { \ + jniThrowExceptionFmt(jnienv, "java/lang/IllegalArgumentException", \ + "Invalid metadata for tag %s (%x)", (writer)->getTagName(tagId), (tagId)); \ + return nullptr; \ + } + + #define BAIL_IF_INVALID_R(expr, jnienv, tagId, writer) \ if ((expr) != OK) { \ jniThrowExceptionFmt(jnienv, "java/lang/IllegalArgumentException", \ @@ -62,14 +72,14 @@ using namespace img_utils; return -1; \ } - -#define BAIL_IF_EMPTY(entry, jnienv, tagId, writer) \ +#define BAIL_IF_EMPTY_RET_NULL_SP(entry, jnienv, tagId, writer) \ if (entry.count == 0) { \ jniThrowExceptionFmt(jnienv, "java/lang/IllegalArgumentException", \ "Missing metadata fields for tag %s (%x)", (writer)->getTagName(tagId), (tagId)); \ - return; \ + return nullptr; \ } + #define ANDROID_DNGCREATOR_CTX_JNI_ID "mNativeContext" static struct { @@ -102,6 +112,26 @@ enum { TIFF_IFD_GPSINFO = 2, }; + +/** + * POD container class for GPS tag data. + */ +class GpsData { +public: + enum { + GPS_VALUE_LENGTH = 6, + GPS_REF_LENGTH = 2, + GPS_DATE_LENGTH = 11, + }; + + uint32_t mLatitude[GPS_VALUE_LENGTH]; + uint32_t mLongitude[GPS_VALUE_LENGTH]; + uint32_t mTimestamp[GPS_VALUE_LENGTH]; + uint8_t mLatitudeRef[GPS_REF_LENGTH]; + uint8_t mLongitudeRef[GPS_REF_LENGTH]; + uint8_t mDate[GPS_DATE_LENGTH]; +}; + // ---------------------------------------------------------------------------- /** @@ -109,8 +139,11 @@ enum { */ class NativeContext : public LightRefBase<NativeContext> { - public: + enum { + DATETIME_COUNT = 20, + }; + NativeContext(const CameraMetadata& characteristics, const CameraMetadata& result); virtual ~NativeContext(); @@ -119,12 +152,28 @@ public: std::shared_ptr<const CameraMetadata> getCharacteristics() const; std::shared_ptr<const CameraMetadata> getResult() const; - uint32_t getThumbnailWidth(); - uint32_t getThumbnailHeight(); - const uint8_t* getThumbnail(); + uint32_t getThumbnailWidth() const; + uint32_t getThumbnailHeight() const; + const uint8_t* getThumbnail() const; + bool hasThumbnail() const; bool setThumbnail(const uint8_t* buffer, uint32_t width, uint32_t height); + void setOrientation(uint16_t orientation); + uint16_t getOrientation() const; + + void setDescription(const String8& desc); + String8 getDescription() const; + bool hasDescription() const; + + void setGpsData(const GpsData& data); + GpsData getGpsData() const; + bool hasGpsData() const; + + void setCaptureTime(const String8& formattedCaptureTime); + String8 getCaptureTime() const; + bool hasCaptureTime() const; + private: Vector<uint8_t> mCurrentThumbnail; TiffWriter mWriter; @@ -132,12 +181,21 @@ private: std::shared_ptr<CameraMetadata> mResult; uint32_t mThumbnailWidth; uint32_t mThumbnailHeight; + uint16_t mOrientation; + bool mThumbnailSet; + bool mGpsSet; + bool mDescriptionSet; + bool mCaptureTimeSet; + String8 mDescription; + GpsData mGpsData; + String8 mFormattedCaptureTime; }; NativeContext::NativeContext(const CameraMetadata& characteristics, const CameraMetadata& result) : mCharacteristics(std::make_shared<CameraMetadata>(characteristics)), mResult(std::make_shared<CameraMetadata>(result)), mThumbnailWidth(0), - mThumbnailHeight(0) {} + mThumbnailHeight(0), mOrientation(0), mThumbnailSet(false), mGpsSet(false), + mDescriptionSet(false), mCaptureTimeSet(false) {} NativeContext::~NativeContext() {} @@ -153,18 +211,22 @@ std::shared_ptr<const CameraMetadata> NativeContext::getResult() const { return mResult; } -uint32_t NativeContext::getThumbnailWidth() { +uint32_t NativeContext::getThumbnailWidth() const { return mThumbnailWidth; } -uint32_t NativeContext::getThumbnailHeight() { +uint32_t NativeContext::getThumbnailHeight() const { return mThumbnailHeight; } -const uint8_t* NativeContext::getThumbnail() { +const uint8_t* NativeContext::getThumbnail() const { return mCurrentThumbnail.array(); } +bool NativeContext::hasThumbnail() const { + return mThumbnailSet; +} + bool NativeContext::setThumbnail(const uint8_t* buffer, uint32_t width, uint32_t height) { mThumbnailWidth = width; mThumbnailHeight = height; @@ -177,9 +239,57 @@ bool NativeContext::setThumbnail(const uint8_t* buffer, uint32_t width, uint32_t uint8_t* thumb = mCurrentThumbnail.editArray(); memcpy(thumb, buffer, size); + mThumbnailSet = true; return true; } +void NativeContext::setOrientation(uint16_t orientation) { + mOrientation = orientation; +} + +uint16_t NativeContext::getOrientation() const { + return mOrientation; +} + +void NativeContext::setDescription(const String8& desc) { + mDescription = desc; + mDescriptionSet = true; +} + +String8 NativeContext::getDescription() const { + return mDescription; +} + +bool NativeContext::hasDescription() const { + return mDescriptionSet; +} + +void NativeContext::setGpsData(const GpsData& data) { + mGpsData = data; + mGpsSet = true; +} + +GpsData NativeContext::getGpsData() const { + return mGpsData; +} + +bool NativeContext::hasGpsData() const { + return mGpsSet; +} + +void NativeContext::setCaptureTime(const String8& formattedCaptureTime) { + mFormattedCaptureTime = formattedCaptureTime; + mCaptureTimeSet = true; +} + +String8 NativeContext::getCaptureTime() const { + return mFormattedCaptureTime; +} + +bool NativeContext::hasCaptureTime() const { + return mCaptureTimeSet; +} + // End of NativeContext // ---------------------------------------------------------------------------- @@ -211,7 +321,7 @@ private: JniOutputStream::JniOutputStream(JNIEnv* env, jobject outStream) : mOutputStream(outStream), mEnv(env) { mByteArray = env->NewByteArray(BYTE_ARRAY_LENGTH); - if (mByteArray == NULL) { + if (mByteArray == nullptr) { jniThrowException(env, "java/lang/OutOfMemoryError", "Could not allocate byte array."); } } @@ -286,7 +396,7 @@ private: JniInputStream::JniInputStream(JNIEnv* env, jobject inStream) : mInStream(inStream), mEnv(env) { mByteArray = env->NewByteArray(BYTE_ARRAY_LENGTH); - if (mByteArray == NULL) { + if (mByteArray == nullptr) { jniThrowException(env, "java/lang/OutOfMemoryError", "Could not allocate byte array."); } } @@ -372,7 +482,7 @@ private: JniInputByteBuffer::JniInputByteBuffer(JNIEnv* env, jobject inBuf) : mInBuf(inBuf), mEnv(env) { mByteArray = env->NewByteArray(BYTE_ARRAY_LENGTH); - if (mByteArray == NULL) { + if (mByteArray == nullptr) { jniThrowException(env, "java/lang/OutOfMemoryError", "Could not allocate byte array."); } } @@ -600,6 +710,7 @@ status_t DirectStripSource::writeToStream(Output& stream, uint32_t count) { return BAD_VALUE; } + if (mPixStride == mBytesPerSample * mSamplesPerPixel && mRowStride == mWidth * mBytesPerSample * mSamplesPerPixel) { ALOGV("%s: Using direct single-pass write for strip.", __FUNCTION__); @@ -643,37 +754,48 @@ uint32_t DirectStripSource::getIfd() const { // ---------------------------------------------------------------------------- /** - * Given a buffer crop rectangle relative to the pixel array size, and the active array crop - * rectangle for the camera characteristics, set the default crop rectangle in the TiffWriter - * relative to the buffer crop rectangle origin. + * Given a buffer crop rectangle relative to the pixel array size, and the pre-correction active + * array crop rectangle for the camera characteristics, set the default crop rectangle in the + * TiffWriter relative to the buffer crop rectangle origin. */ static status_t calculateAndSetCrop(JNIEnv* env, const CameraMetadata& characteristics, - uint32_t bufXMin, uint32_t bufYMin, uint32_t bufWidth, uint32_t bufHeight, - TiffWriter* writer) { + uint32_t bufWidth, uint32_t bufHeight, sp<TiffWriter> writer) { camera_metadata_ro_entry entry = - characteristics.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE); + characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); uint32_t xmin = static_cast<uint32_t>(entry.data.i32[0]); uint32_t ymin = static_cast<uint32_t>(entry.data.i32[1]); uint32_t width = static_cast<uint32_t>(entry.data.i32[2]); uint32_t height = static_cast<uint32_t>(entry.data.i32[3]); + const uint32_t margin = 8; // Default margin recommended by Adobe for interpolation. + + // Crop based on pre-correction array for pixel array uint32_t aLeft = xmin; uint32_t aTop = ymin; uint32_t aRight = xmin + width; uint32_t aBottom = ymin + height; - const uint32_t margin = 8; // Default margin recommended by Adobe for interpolation. - - uint32_t bLeft = bufXMin + margin; - uint32_t bTop = bufYMin + margin; - uint32_t bRight = bufXMin + bufWidth - margin; - uint32_t bBottom = bufYMin + bufHeight - margin; + // 8 pixel border crop for pixel array dimens + uint32_t bLeft = margin; + uint32_t bTop = margin; + uint32_t bRight = bufWidth - margin; + uint32_t bBottom = bufHeight - margin; + // Set the crop to be the intersection of the two rectangles uint32_t defaultCropOrigin[] = {std::max(aLeft, bLeft), std::max(aTop, bTop)}; uint32_t defaultCropSize[] = {std::min(aRight, bRight) - defaultCropOrigin[0], std::min(aBottom, bBottom) - defaultCropOrigin[1]}; + // If using buffers with pre-correction array dimens, switch to 8 pixel border crop + // relative to the pixel array dimens + if (bufWidth == width && bufHeight == height) { + defaultCropOrigin[0] = xmin + margin; + defaultCropOrigin[1] = ymin + margin; + defaultCropSize[0] = width - margin; + defaultCropSize[1] = height - margin; + } + BAIL_IF_INVALID_R(writer->addEntry(TAG_DEFAULTCROPORIGIN, 2, defaultCropOrigin, TIFF_IFD_0), env, TAG_DEFAULTCROPORIGIN, writer); BAIL_IF_INVALID_R(writer->addEntry(TAG_DEFAULTCROPSIZE, 2, defaultCropSize, @@ -682,9 +804,8 @@ static status_t calculateAndSetCrop(JNIEnv* env, const CameraMetadata& character return OK; } -static bool validateDngHeader(JNIEnv* env, TiffWriter* writer, +static bool validateDngHeader(JNIEnv* env, sp<TiffWriter> writer, const CameraMetadata& characteristics, jint width, jint height) { - // TODO: handle lens shading map, etc. conversions for other raw buffer sizes. if (width <= 0) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", \ "Image width %d is invalid", width); @@ -710,20 +831,7 @@ static bool validateDngHeader(JNIEnv* env, TiffWriter* writer, bool matchesPixelArray = (pWidth == width && pHeight == height); bool matchesPreCorrectionArray = (cWidth == width && cHeight == height); - if (matchesPixelArray) { - if (calculateAndSetCrop(env, characteristics, 0, 0, static_cast<uint32_t>(pWidth), - static_cast<uint32_t>(pHeight), writer) != OK) { - return false; - } - } else if (matchesPreCorrectionArray) { - if (calculateAndSetCrop(env, characteristics, - static_cast<uint32_t>(preCorrectionEntry.data.i32[0]), - static_cast<uint32_t>(preCorrectionEntry.data.i32[1]), - static_cast<uint32_t>(preCorrectionEntry.data.i32[2]), - static_cast<uint32_t>(preCorrectionEntry.data.i32[3]), writer) != OK) { - return false; - } - } else { + if (!(matchesPixelArray || matchesPreCorrectionArray)) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", \ "Image dimensions (w=%d,h=%d) are invalid, must match either the pixel " "array size (w=%d, h=%d) or the pre-correction array size (w=%d, h=%d)", @@ -734,12 +842,12 @@ static bool validateDngHeader(JNIEnv* env, TiffWriter* writer, return true; } -static status_t moveEntries(TiffWriter* writer, uint32_t ifdFrom, uint32_t ifdTo, +static status_t moveEntries(sp<TiffWriter> writer, uint32_t ifdFrom, uint32_t ifdTo, const Vector<uint16_t>& entries) { for (size_t i = 0; i < entries.size(); ++i) { uint16_t tagId = entries[i]; sp<TiffEntry> entry = writer->getEntry(tagId, ifdFrom); - if (entry == NULL) { + if (entry.get() == nullptr) { ALOGE("%s: moveEntries failed, entry %u not found in IFD %u", __FUNCTION__, tagId, ifdFrom); return BAD_VALUE; @@ -881,7 +989,7 @@ static void DngCreator_setNativeContext(JNIEnv* env, jobject thiz, sp<NativeCont ALOGV("%s:", __FUNCTION__); NativeContext* current = DngCreator_getNativeContext(env, thiz); - if (context != NULL) { + if (context != nullptr) { context->incStrong((void*) DngCreator_setNativeContext); } @@ -893,15 +1001,6 @@ static void DngCreator_setNativeContext(JNIEnv* env, jobject thiz, sp<NativeCont reinterpret_cast<jlong>(context.get())); } -static TiffWriter* DngCreator_getCreator(JNIEnv* env, jobject thiz) { - ALOGV("%s:", __FUNCTION__); - NativeContext* current = DngCreator_getNativeContext(env, thiz); - if (current) { - return current->getWriter(); - } - return NULL; -} - static void DngCreator_nativeClassInit(JNIEnv* env, jclass clazz) { ALOGV("%s:", __FUNCTION__); @@ -938,7 +1037,62 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt } sp<NativeContext> nativeContext = new NativeContext(characteristics, results); - TiffWriter* writer = nativeContext->getWriter(); + + const char* captureTime = env->GetStringUTFChars(formattedCaptureTime, nullptr); + + size_t len = strlen(captureTime) + 1; + if (len != NativeContext::DATETIME_COUNT) { + jniThrowException(env, "java/lang/IllegalArgumentException", + "Formatted capture time string length is not required 20 characters"); + return; + } + + nativeContext->setCaptureTime(String8(captureTime)); + + DngCreator_setNativeContext(env, thiz, nativeContext); +} + +static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t imageWidth, + uint32_t imageHeight) { + + NativeContext* nativeContext = DngCreator_getNativeContext(env, thiz); + + if (nativeContext == nullptr) { + jniThrowException(env, "java/lang/AssertionError", + "No native context, must call init before other operations."); + return nullptr; + } + + CameraMetadata characteristics = *(nativeContext->getCharacteristics()); + CameraMetadata results = *(nativeContext->getResult()); + + sp<TiffWriter> writer = new TiffWriter(); + + uint32_t preWidth = 0; + uint32_t preHeight = 0; + { + // Check dimensions + camera_metadata_entry entry = + characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_IMAGEWIDTH, writer); + preWidth = static_cast<uint32_t>(entry.data.i32[2]); + preHeight = static_cast<uint32_t>(entry.data.i32[3]); + + camera_metadata_entry pixelArrayEntry = + characteristics.find(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE); + uint32_t pixWidth = static_cast<uint32_t>(pixelArrayEntry.data.i32[0]); + uint32_t pixHeight = static_cast<uint32_t>(pixelArrayEntry.data.i32[1]); + + if (!((imageWidth == preWidth && imageHeight == preHeight) || + (imageWidth == pixWidth && imageHeight == pixHeight))) { + jniThrowException(env, "java/lang/AssertionError", + "Height and width of imate buffer did not match height and width of" + "either the preCorrectionActiveArraySize or the pixelArraySize."); + return nullptr; + } + } + + writer->addIfd(TIFF_IFD_0); @@ -946,8 +1100,6 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt const uint32_t samplesPerPixel = 1; const uint32_t bitsPerSample = BITS_PER_SAMPLE; - uint32_t imageWidth = 0; - uint32_t imageHeight = 0; OpcodeListBuilder::CfaLayout opcodeCfaLayout = OpcodeListBuilder::CFA_RGGB; uint8_t cfaPlaneColor[3] = {0, 1, 2}; @@ -961,93 +1113,86 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt { // Set orientation uint16_t orientation = 1; // Normal - BAIL_IF_INVALID(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_0), env, - TAG_ORIENTATION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_0), + env, TAG_ORIENTATION, writer); } { // Set subfiletype uint32_t subfileType = 0; // Main image - BAIL_IF_INVALID(writer->addEntry(TAG_NEWSUBFILETYPE, 1, &subfileType, TIFF_IFD_0), env, - TAG_NEWSUBFILETYPE, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_NEWSUBFILETYPE, 1, &subfileType, + TIFF_IFD_0), env, TAG_NEWSUBFILETYPE, writer); } { // Set bits per sample uint16_t bits = static_cast<uint16_t>(bitsPerSample); - BAIL_IF_INVALID(writer->addEntry(TAG_BITSPERSAMPLE, 1, &bits, TIFF_IFD_0), env, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_BITSPERSAMPLE, 1, &bits, TIFF_IFD_0), env, TAG_BITSPERSAMPLE, writer); } { // Set compression uint16_t compression = 1; // None - BAIL_IF_INVALID(writer->addEntry(TAG_COMPRESSION, 1, &compression, TIFF_IFD_0), env, - TAG_COMPRESSION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_COMPRESSION, 1, &compression, + TIFF_IFD_0), env, TAG_COMPRESSION, writer); } { // Set dimensions - camera_metadata_entry entry = - characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); - BAIL_IF_EMPTY(entry, env, TAG_IMAGEWIDTH, writer); - uint32_t width = static_cast<uint32_t>(entry.data.i32[2]); - uint32_t height = static_cast<uint32_t>(entry.data.i32[3]); - BAIL_IF_INVALID(writer->addEntry(TAG_IMAGEWIDTH, 1, &width, TIFF_IFD_0), env, - TAG_IMAGEWIDTH, writer); - BAIL_IF_INVALID(writer->addEntry(TAG_IMAGELENGTH, 1, &height, TIFF_IFD_0), env, - TAG_IMAGELENGTH, writer); - imageWidth = width; - imageHeight = height; + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_IMAGEWIDTH, 1, &imageWidth, TIFF_IFD_0), + env, TAG_IMAGEWIDTH, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_IMAGELENGTH, 1, &imageHeight, TIFF_IFD_0), + env, TAG_IMAGELENGTH, writer); } { // Set photometric interpretation uint16_t interpretation = 32803; // CFA - BAIL_IF_INVALID(writer->addEntry(TAG_PHOTOMETRICINTERPRETATION, 1, &interpretation, - TIFF_IFD_0), env, TAG_PHOTOMETRICINTERPRETATION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_PHOTOMETRICINTERPRETATION, 1, + &interpretation, TIFF_IFD_0), env, TAG_PHOTOMETRICINTERPRETATION, writer); } { // Set blacklevel tags camera_metadata_entry entry = characteristics.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN); - BAIL_IF_EMPTY(entry, env, TAG_BLACKLEVEL, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_BLACKLEVEL, writer); const uint32_t* blackLevel = reinterpret_cast<const uint32_t*>(entry.data.i32); - BAIL_IF_INVALID(writer->addEntry(TAG_BLACKLEVEL, entry.count, blackLevel, TIFF_IFD_0), env, - TAG_BLACKLEVEL, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_BLACKLEVEL, entry.count, blackLevel, + TIFF_IFD_0), env, TAG_BLACKLEVEL, writer); uint16_t repeatDim[2] = {2, 2}; - BAIL_IF_INVALID(writer->addEntry(TAG_BLACKLEVELREPEATDIM, 2, repeatDim, TIFF_IFD_0), env, - TAG_BLACKLEVELREPEATDIM, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_BLACKLEVELREPEATDIM, 2, repeatDim, + TIFF_IFD_0), env, TAG_BLACKLEVELREPEATDIM, writer); } { // Set samples per pixel uint16_t samples = static_cast<uint16_t>(samplesPerPixel); - BAIL_IF_INVALID(writer->addEntry(TAG_SAMPLESPERPIXEL, 1, &samples, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_SAMPLESPERPIXEL, 1, &samples, TIFF_IFD_0), env, TAG_SAMPLESPERPIXEL, writer); } { // Set planar configuration uint16_t config = 1; // Chunky - BAIL_IF_INVALID(writer->addEntry(TAG_PLANARCONFIGURATION, 1, &config, TIFF_IFD_0), - env, TAG_PLANARCONFIGURATION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_PLANARCONFIGURATION, 1, &config, + TIFF_IFD_0), env, TAG_PLANARCONFIGURATION, writer); } { // Set CFA pattern dimensions uint16_t repeatDim[2] = {2, 2}; - BAIL_IF_INVALID(writer->addEntry(TAG_CFAREPEATPATTERNDIM, 2, repeatDim, TIFF_IFD_0), - env, TAG_CFAREPEATPATTERNDIM, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CFAREPEATPATTERNDIM, 2, repeatDim, + TIFF_IFD_0), env, TAG_CFAREPEATPATTERNDIM, writer); } { // Set CFA pattern camera_metadata_entry entry = characteristics.find(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT); - BAIL_IF_EMPTY(entry, env, TAG_CFAPATTERN, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_CFAPATTERN, writer); const int cfaLength = 4; cfaEnum = entry.data.u8[0]; @@ -1057,30 +1202,30 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt "Invalid metadata for tag %d", TAG_CFAPATTERN); } - BAIL_IF_INVALID(writer->addEntry(TAG_CFAPATTERN, cfaLength, cfa, TIFF_IFD_0), env, - TAG_CFAPATTERN, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CFAPATTERN, cfaLength, cfa, TIFF_IFD_0), + env, TAG_CFAPATTERN, writer); opcodeCfaLayout = convertCFAEnumToOpcodeLayout(cfaEnum); } { // Set CFA plane color - BAIL_IF_INVALID(writer->addEntry(TAG_CFAPLANECOLOR, 3, cfaPlaneColor, TIFF_IFD_0), - env, TAG_CFAPLANECOLOR, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CFAPLANECOLOR, 3, cfaPlaneColor, + TIFF_IFD_0), env, TAG_CFAPLANECOLOR, writer); } { // Set CFA layout uint16_t cfaLayout = 1; - BAIL_IF_INVALID(writer->addEntry(TAG_CFALAYOUT, 1, &cfaLayout, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CFALAYOUT, 1, &cfaLayout, TIFF_IFD_0), env, TAG_CFALAYOUT, writer); } { // image description uint8_t imageDescription = '\0'; // empty - BAIL_IF_INVALID(writer->addEntry(TAG_IMAGEDESCRIPTION, 1, &imageDescription, TIFF_IFD_0), - env, TAG_IMAGEDESCRIPTION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_IMAGEDESCRIPTION, 1, &imageDescription, + TIFF_IFD_0), env, TAG_IMAGEDESCRIPTION, writer); } { @@ -1091,8 +1236,8 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt property_get("ro.product.manufacturer", manufacturer, ""); uint32_t count = static_cast<uint32_t>(strlen(manufacturer)) + 1; - BAIL_IF_INVALID(writer->addEntry(TAG_MAKE, count, reinterpret_cast<uint8_t*>(manufacturer), - TIFF_IFD_0), env, TAG_MAKE, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_MAKE, count, + reinterpret_cast<uint8_t*>(manufacturer), TIFF_IFD_0), env, TAG_MAKE, writer); } { @@ -1103,23 +1248,23 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt property_get("ro.product.model", model, ""); uint32_t count = static_cast<uint32_t>(strlen(model)) + 1; - BAIL_IF_INVALID(writer->addEntry(TAG_MODEL, count, reinterpret_cast<uint8_t*>(model), - TIFF_IFD_0), env, TAG_MODEL, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_MODEL, count, + reinterpret_cast<uint8_t*>(model), TIFF_IFD_0), env, TAG_MODEL, writer); } { // x resolution uint32_t xres[] = { 72, 1 }; // default 72 ppi - BAIL_IF_INVALID(writer->addEntry(TAG_XRESOLUTION, 1, xres, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_XRESOLUTION, 1, xres, TIFF_IFD_0), env, TAG_XRESOLUTION, writer); // y resolution uint32_t yres[] = { 72, 1 }; // default 72 ppi - BAIL_IF_INVALID(writer->addEntry(TAG_YRESOLUTION, 1, yres, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_YRESOLUTION, 1, yres, TIFF_IFD_0), env, TAG_YRESOLUTION, writer); uint16_t unit = 2; // inches - BAIL_IF_INVALID(writer->addEntry(TAG_RESOLUTIONUNIT, 1, &unit, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_RESOLUTIONUNIT, 1, &unit, TIFF_IFD_0), env, TAG_RESOLUTIONUNIT, writer); } @@ -1128,52 +1273,41 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt char software[PROPERTY_VALUE_MAX]; property_get("ro.build.fingerprint", software, ""); uint32_t count = static_cast<uint32_t>(strlen(software)) + 1; - BAIL_IF_INVALID(writer->addEntry(TAG_SOFTWARE, count, reinterpret_cast<uint8_t*>(software), - TIFF_IFD_0), env, TAG_SOFTWARE, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_SOFTWARE, count, + reinterpret_cast<uint8_t*>(software), TIFF_IFD_0), env, TAG_SOFTWARE, writer); } - { + if (nativeContext->hasCaptureTime()) { // datetime - const size_t DATETIME_COUNT = 20; - const char* captureTime = env->GetStringUTFChars(formattedCaptureTime, NULL); - - size_t len = strlen(captureTime) + 1; - if (len != DATETIME_COUNT) { - jniThrowException(env, "java/lang/IllegalArgumentException", - "Timestamp string length is not required 20 characters"); - return; - } + String8 captureTime = nativeContext->getCaptureTime(); - if (writer->addEntry(TAG_DATETIME, DATETIME_COUNT, - reinterpret_cast<const uint8_t*>(captureTime), TIFF_IFD_0) != OK) { - env->ReleaseStringUTFChars(formattedCaptureTime, captureTime); + if (writer->addEntry(TAG_DATETIME, NativeContext::DATETIME_COUNT, + reinterpret_cast<const uint8_t*>(captureTime.string()), TIFF_IFD_0) != OK) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid metadata for tag %x", TAG_DATETIME); - return; + return nullptr; } // datetime original - if (writer->addEntry(TAG_DATETIMEORIGINAL, DATETIME_COUNT, - reinterpret_cast<const uint8_t*>(captureTime), TIFF_IFD_0) != OK) { - env->ReleaseStringUTFChars(formattedCaptureTime, captureTime); + if (writer->addEntry(TAG_DATETIMEORIGINAL, NativeContext::DATETIME_COUNT, + reinterpret_cast<const uint8_t*>(captureTime.string()), TIFF_IFD_0) != OK) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid metadata for tag %x", TAG_DATETIMEORIGINAL); - return; + return nullptr; } - env->ReleaseStringUTFChars(formattedCaptureTime, captureTime); } { // TIFF/EP standard id uint8_t standardId[] = { 1, 0, 0, 0 }; - BAIL_IF_INVALID(writer->addEntry(TAG_TIFFEPSTANDARDID, 4, standardId, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_TIFFEPSTANDARDID, 4, standardId, TIFF_IFD_0), env, TAG_TIFFEPSTANDARDID, writer); } { // copyright uint8_t copyright = '\0'; // empty - BAIL_IF_INVALID(writer->addEntry(TAG_COPYRIGHT, 1, ©right, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_COPYRIGHT, 1, ©right, TIFF_IFD_0), env, TAG_COPYRIGHT, writer); } @@ -1181,7 +1315,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // exposure time camera_metadata_entry entry = results.find(ANDROID_SENSOR_EXPOSURE_TIME); - BAIL_IF_EMPTY(entry, env, TAG_EXPOSURETIME, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_EXPOSURETIME, writer); int64_t exposureTime = *(entry.data.i64); @@ -1189,7 +1323,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Should be unreachable jniThrowException(env, "java/lang/IllegalArgumentException", "Negative exposure time in metadata"); - return; + return nullptr; } // Ensure exposure time doesn't overflow (for exposures > 4s) @@ -1201,12 +1335,12 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Should be unreachable jniThrowException(env, "java/lang/IllegalArgumentException", "Exposure time too long"); - return; + return nullptr; } } uint32_t exposure[] = { static_cast<uint32_t>(exposureTime), denominator }; - BAIL_IF_INVALID(writer->addEntry(TAG_EXPOSURETIME, 1, exposure, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_EXPOSURETIME, 1, exposure, TIFF_IFD_0), env, TAG_EXPOSURETIME, writer); } @@ -1215,13 +1349,13 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // ISO speed ratings camera_metadata_entry entry = results.find(ANDROID_SENSOR_SENSITIVITY); - BAIL_IF_EMPTY(entry, env, TAG_ISOSPEEDRATINGS, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_ISOSPEEDRATINGS, writer); int32_t tempIso = *(entry.data.i32); if (tempIso < 0) { jniThrowException(env, "java/lang/IllegalArgumentException", "Negative ISO value"); - return; + return nullptr; } if (tempIso > UINT16_MAX) { @@ -1230,7 +1364,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt } uint16_t iso = static_cast<uint16_t>(tempIso); - BAIL_IF_INVALID(writer->addEntry(TAG_ISOSPEEDRATINGS, 1, &iso, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ISOSPEEDRATINGS, 1, &iso, TIFF_IFD_0), env, TAG_ISOSPEEDRATINGS, writer); } @@ -1238,10 +1372,10 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // focal length camera_metadata_entry entry = results.find(ANDROID_LENS_FOCAL_LENGTH); - BAIL_IF_EMPTY(entry, env, TAG_FOCALLENGTH, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_FOCALLENGTH, writer); uint32_t focalLength[] = { static_cast<uint32_t>(*(entry.data.f) * 100), 100 }; - BAIL_IF_INVALID(writer->addEntry(TAG_FOCALLENGTH, 1, focalLength, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_FOCALLENGTH, 1, focalLength, TIFF_IFD_0), env, TAG_FOCALLENGTH, writer); } @@ -1249,39 +1383,39 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // f number camera_metadata_entry entry = results.find(ANDROID_LENS_APERTURE); - BAIL_IF_EMPTY(entry, env, TAG_FNUMBER, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_FNUMBER, writer); uint32_t fnum[] = { static_cast<uint32_t>(*(entry.data.f) * 100), 100 }; - BAIL_IF_INVALID(writer->addEntry(TAG_FNUMBER, 1, fnum, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_FNUMBER, 1, fnum, TIFF_IFD_0), env, TAG_FNUMBER, writer); } { // Set DNG version information uint8_t version[4] = {1, 4, 0, 0}; - BAIL_IF_INVALID(writer->addEntry(TAG_DNGVERSION, 4, version, TIFF_IFD_0), + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_DNGVERSION, 4, version, TIFF_IFD_0), env, TAG_DNGVERSION, writer); uint8_t backwardVersion[4] = {1, 1, 0, 0}; - BAIL_IF_INVALID(writer->addEntry(TAG_DNGBACKWARDVERSION, 4, backwardVersion, TIFF_IFD_0), - env, TAG_DNGBACKWARDVERSION, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_DNGBACKWARDVERSION, 4, backwardVersion, + TIFF_IFD_0), env, TAG_DNGBACKWARDVERSION, writer); } { // Set whitelevel camera_metadata_entry entry = characteristics.find(ANDROID_SENSOR_INFO_WHITE_LEVEL); - BAIL_IF_EMPTY(entry, env, TAG_WHITELEVEL, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_WHITELEVEL, writer); uint32_t whiteLevel = static_cast<uint32_t>(entry.data.i32[0]); - BAIL_IF_INVALID(writer->addEntry(TAG_WHITELEVEL, 1, &whiteLevel, TIFF_IFD_0), env, - TAG_WHITELEVEL, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_WHITELEVEL, 1, &whiteLevel, TIFF_IFD_0), + env, TAG_WHITELEVEL, writer); } { // Set default scale uint32_t defaultScale[4] = {1, 1, 1, 1}; - BAIL_IF_INVALID(writer->addEntry(TAG_DEFAULTSCALE, 2, defaultScale, TIFF_IFD_0), - env, TAG_DEFAULTSCALE, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_DEFAULTSCALE, 2, defaultScale, + TIFF_IFD_0), env, TAG_DEFAULTSCALE, writer); } bool singleIlluminant = false; @@ -1289,7 +1423,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Set calibration illuminants camera_metadata_entry entry1 = characteristics.find(ANDROID_SENSOR_REFERENCE_ILLUMINANT1); - BAIL_IF_EMPTY(entry1, env, TAG_CALIBRATIONILLUMINANT1, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry1, env, TAG_CALIBRATIONILLUMINANT1, writer); camera_metadata_entry entry2 = characteristics.find(ANDROID_SENSOR_REFERENCE_ILLUMINANT2); if (entry2.count == 0) { @@ -1297,12 +1431,12 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt } uint16_t ref1 = entry1.data.u8[0]; - BAIL_IF_INVALID(writer->addEntry(TAG_CALIBRATIONILLUMINANT1, 1, &ref1, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CALIBRATIONILLUMINANT1, 1, &ref1, TIFF_IFD_0), env, TAG_CALIBRATIONILLUMINANT1, writer); if (!singleIlluminant) { uint16_t ref2 = entry2.data.u8[0]; - BAIL_IF_INVALID(writer->addEntry(TAG_CALIBRATIONILLUMINANT2, 1, &ref2, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CALIBRATIONILLUMINANT2, 1, &ref2, TIFF_IFD_0), env, TAG_CALIBRATIONILLUMINANT2, writer); } } @@ -1311,7 +1445,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Set color transforms camera_metadata_entry entry1 = characteristics.find(ANDROID_SENSOR_COLOR_TRANSFORM1); - BAIL_IF_EMPTY(entry1, env, TAG_COLORMATRIX1, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry1, env, TAG_COLORMATRIX1, writer); int32_t colorTransform1[entry1.count * 2]; @@ -1321,12 +1455,12 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt colorTransform1[ctr++] = entry1.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_COLORMATRIX1, entry1.count, colorTransform1, - TIFF_IFD_0), env, TAG_COLORMATRIX1, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_COLORMATRIX1, entry1.count, + colorTransform1, TIFF_IFD_0), env, TAG_COLORMATRIX1, writer); if (!singleIlluminant) { camera_metadata_entry entry2 = characteristics.find(ANDROID_SENSOR_COLOR_TRANSFORM2); - BAIL_IF_EMPTY(entry2, env, TAG_COLORMATRIX2, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry2, env, TAG_COLORMATRIX2, writer); int32_t colorTransform2[entry2.count * 2]; ctr = 0; @@ -1335,8 +1469,8 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt colorTransform2[ctr++] = entry2.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_COLORMATRIX2, entry2.count, colorTransform2, - TIFF_IFD_0), env, TAG_COLORMATRIX2, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_COLORMATRIX2, entry2.count, + colorTransform2, TIFF_IFD_0), env, TAG_COLORMATRIX2, writer); } } @@ -1344,7 +1478,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Set calibration transforms camera_metadata_entry entry1 = characteristics.find(ANDROID_SENSOR_CALIBRATION_TRANSFORM1); - BAIL_IF_EMPTY(entry1, env, TAG_CAMERACALIBRATION1, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry1, env, TAG_CAMERACALIBRATION1, writer); int32_t calibrationTransform1[entry1.count * 2]; @@ -1354,13 +1488,13 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt calibrationTransform1[ctr++] = entry1.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION1, entry1.count, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CAMERACALIBRATION1, entry1.count, calibrationTransform1, TIFF_IFD_0), env, TAG_CAMERACALIBRATION1, writer); if (!singleIlluminant) { camera_metadata_entry entry2 = characteristics.find(ANDROID_SENSOR_CALIBRATION_TRANSFORM2); - BAIL_IF_EMPTY(entry2, env, TAG_CAMERACALIBRATION2, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry2, env, TAG_CAMERACALIBRATION2, writer); int32_t calibrationTransform2[entry2.count * 2]; ctr = 0; @@ -1369,7 +1503,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt calibrationTransform2[ctr++] = entry2.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION2, entry2.count, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_CAMERACALIBRATION2, entry2.count, calibrationTransform2, TIFF_IFD_0), env, TAG_CAMERACALIBRATION2, writer); } } @@ -1378,7 +1512,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Set forward transforms camera_metadata_entry entry1 = characteristics.find(ANDROID_SENSOR_FORWARD_MATRIX1); - BAIL_IF_EMPTY(entry1, env, TAG_FORWARDMATRIX1, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry1, env, TAG_FORWARDMATRIX1, writer); int32_t forwardTransform1[entry1.count * 2]; @@ -1388,13 +1522,13 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt forwardTransform1[ctr++] = entry1.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_FORWARDMATRIX1, entry1.count, forwardTransform1, - TIFF_IFD_0), env, TAG_FORWARDMATRIX1, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_FORWARDMATRIX1, entry1.count, + forwardTransform1, TIFF_IFD_0), env, TAG_FORWARDMATRIX1, writer); if (!singleIlluminant) { camera_metadata_entry entry2 = characteristics.find(ANDROID_SENSOR_FORWARD_MATRIX2); - BAIL_IF_EMPTY(entry2, env, TAG_FORWARDMATRIX2, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry2, env, TAG_FORWARDMATRIX2, writer); int32_t forwardTransform2[entry2.count * 2]; ctr = 0; @@ -1403,8 +1537,8 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt forwardTransform2[ctr++] = entry2.data.r[i].denominator; } - BAIL_IF_INVALID(writer->addEntry(TAG_FORWARDMATRIX2, entry2.count, forwardTransform2, - TIFF_IFD_0), env, TAG_FORWARDMATRIX2, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_FORWARDMATRIX2, entry2.count, + forwardTransform2, TIFF_IFD_0), env, TAG_FORWARDMATRIX2, writer); } } @@ -1412,7 +1546,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt // Set camera neutral camera_metadata_entry entry = results.find(ANDROID_SENSOR_NEUTRAL_COLOR_POINT); - BAIL_IF_EMPTY(entry, env, TAG_ASSHOTNEUTRAL, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_ASSHOTNEUTRAL, writer); uint32_t cameraNeutral[entry.count * 2]; size_t ctr = 0; @@ -1423,33 +1557,27 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt static_cast<uint32_t>(entry.data.r[i].denominator); } - BAIL_IF_INVALID(writer->addEntry(TAG_ASSHOTNEUTRAL, entry.count, cameraNeutral, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ASSHOTNEUTRAL, entry.count, cameraNeutral, TIFF_IFD_0), env, TAG_ASSHOTNEUTRAL, writer); } - { - // Setup data strips - // TODO: Switch to tiled implementation. - if (writer->addStrip(TIFF_IFD_0) != OK) { - ALOGE("%s: Could not setup strip tags.", __FUNCTION__); - jniThrowException(env, "java/lang/IllegalStateException", - "Failed to setup strip tags."); - return; - } - } { // Set dimensions + if (calculateAndSetCrop(env, characteristics, imageWidth, imageHeight, writer) != OK) { + return nullptr; + } camera_metadata_entry entry = characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); - BAIL_IF_EMPTY(entry, env, TAG_DEFAULTCROPSIZE, writer); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_DEFAULTCROPSIZE, writer); uint32_t xmin = static_cast<uint32_t>(entry.data.i32[0]); uint32_t ymin = static_cast<uint32_t>(entry.data.i32[1]); uint32_t width = static_cast<uint32_t>(entry.data.i32[2]); uint32_t height = static_cast<uint32_t>(entry.data.i32[3]); - if (calculateAndSetCrop(env, characteristics, xmin, ymin, width, height, writer) != OK) { - return; - } + + uint32_t activeArea[] = {ymin, xmin, ymin + height, xmin + width}; + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ACTIVEAREA, 4, activeArea, TIFF_IFD_0), + env, TAG_ACTIVEAREA, writer); } { @@ -1469,7 +1597,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt cameraModel += "-"; cameraModel += brand; - BAIL_IF_INVALID(writer->addEntry(TAG_UNIQUECAMERAMODEL, cameraModel.size() + 1, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_UNIQUECAMERAMODEL, cameraModel.size() + 1, reinterpret_cast<const uint8_t*>(cameraModel.string()), TIFF_IFD_0), env, TAG_UNIQUECAMERAMODEL, writer); } @@ -1486,7 +1614,7 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt if ((err = convertCFA(cfaEnum, /*out*/cfaOut)) != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid CFA from camera characteristics"); - return; + return nullptr; } double noiseProfile[numPlaneColors * 2]; @@ -1500,8 +1628,9 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt if ((err = generateNoiseProfile(entry.data.d, cfaOut, numCfaChannels, cfaPlaneColor, numPlaneColors, /*out*/ noiseProfile)) == OK) { - BAIL_IF_INVALID(writer->addEntry(TAG_NOISEPROFILE, numPlaneColors * 2, - noiseProfile, TIFF_IFD_0), env, TAG_NOISEPROFILE, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_NOISEPROFILE, + numPlaneColors * 2, noiseProfile, TIFF_IFD_0), env, TAG_NOISEPROFILE, + writer); } else { ALOGW("%s: Error converting coefficients for noise profile, no noise profile" " tag written...", __FUNCTION__); @@ -1533,19 +1662,26 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt camera_metadata_entry entry2 = results.find(ANDROID_STATISTICS_LENS_SHADING_MAP); + camera_metadata_entry entry = + characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); + BAIL_IF_EMPTY_RET_NULL_SP(entry, env, TAG_IMAGEWIDTH, writer); + uint32_t xmin = static_cast<uint32_t>(entry.data.i32[0]); + uint32_t ymin = static_cast<uint32_t>(entry.data.i32[1]); + uint32_t width = static_cast<uint32_t>(entry.data.i32[2]); + uint32_t height = static_cast<uint32_t>(entry.data.i32[3]); if (entry2.count > 0 && entry2.count == lsmWidth * lsmHeight * 4) { err = builder.addGainMapsForMetadata(lsmWidth, lsmHeight, - 0, - 0, - imageHeight, - imageWidth, + ymin, + xmin, + height, + width, opcodeCfaLayout, entry2.data.f); if (err != OK) { ALOGE("%s: Could not add Lens shading map.", __FUNCTION__); jniThrowRuntimeException(env, "failed to add lens shading map."); - return; + return nullptr; } } @@ -1553,14 +1689,14 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt uint8_t opcodeListBuf[listSize]; err = builder.buildOpList(opcodeListBuf); if (err == OK) { - BAIL_IF_INVALID(writer->addEntry(TAG_OPCODELIST2, listSize, opcodeListBuf, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST2, listSize, opcodeListBuf, TIFF_IFD_0), env, TAG_OPCODELIST2, writer); } else { ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading" "map.", __FUNCTION__); jniThrowRuntimeException(env, "failed to construct opcode list for distortion" " correction and lens shading map"); - return; + return nullptr; } } @@ -1578,12 +1714,12 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt if (entry3.count == 6 && entry4.count == 5) { float cx = entry4.data.f[/*c_x*/2]; float cy = entry4.data.f[/*c_y*/3]; - err = builder.addWarpRectilinearForMetadata(entry3.data.f, imageWidth, imageHeight, cx, + err = builder.addWarpRectilinearForMetadata(entry3.data.f, preWidth, preHeight, cx, cy); if (err != OK) { ALOGE("%s: Could not add distortion correction.", __FUNCTION__); jniThrowRuntimeException(env, "failed to add distortion correction."); - return; + return nullptr; } } @@ -1591,30 +1727,236 @@ static void DngCreator_init(JNIEnv* env, jobject thiz, jobject characteristicsPt uint8_t opcodeListBuf[listSize]; err = builder.buildOpList(opcodeListBuf); if (err == OK) { - BAIL_IF_INVALID(writer->addEntry(TAG_OPCODELIST3, listSize, opcodeListBuf, + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST3, listSize, opcodeListBuf, TIFF_IFD_0), env, TAG_OPCODELIST3, writer); } else { ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading" "map.", __FUNCTION__); jniThrowRuntimeException(env, "failed to construct opcode list for distortion" " correction and lens shading map"); - return; + return nullptr; } } - DngCreator_setNativeContext(env, thiz, nativeContext); + { + // Set up orientation tags. + uint16_t orientation = nativeContext->getOrientation(); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_0), + env, TAG_ORIENTATION, writer); + + } + + if (nativeContext->hasDescription()){ + // Set Description + String8 description = nativeContext->getDescription(); + size_t len = description.bytes() + 1; + if (writer->addEntry(TAG_IMAGEDESCRIPTION, len, + reinterpret_cast<const uint8_t*>(description.string()), TIFF_IFD_0) != OK) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Invalid metadata for tag %x", TAG_IMAGEDESCRIPTION); + } + } + + if (nativeContext->hasGpsData()) { + // Set GPS tags + GpsData gpsData = nativeContext->getGpsData(); + if (!writer->hasIfd(TIFF_IFD_GPSINFO)) { + if (writer->addSubIfd(TIFF_IFD_0, TIFF_IFD_GPSINFO, TiffWriter::GPSINFO) != OK) { + ALOGE("%s: Failed to add GpsInfo IFD %u to IFD %u", __FUNCTION__, TIFF_IFD_GPSINFO, + TIFF_IFD_0); + jniThrowException(env, "java/lang/IllegalStateException", "Failed to add GPSINFO"); + return nullptr; + } + } + + { + uint8_t version[] = {2, 3, 0, 0}; + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSVERSIONID, 4, version, + TIFF_IFD_GPSINFO), env, TAG_GPSVERSIONID, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSLATITUDEREF, + GpsData::GPS_REF_LENGTH, gpsData.mLatitudeRef, TIFF_IFD_GPSINFO), env, + TAG_GPSLATITUDEREF, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSLONGITUDEREF, + GpsData::GPS_REF_LENGTH, gpsData.mLongitudeRef, TIFF_IFD_GPSINFO), env, + TAG_GPSLONGITUDEREF, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSLATITUDE, 3, gpsData.mLatitude, + TIFF_IFD_GPSINFO), env, TAG_GPSLATITUDE, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSLONGITUDE, 3, gpsData.mLongitude, + TIFF_IFD_GPSINFO), env, TAG_GPSLONGITUDE, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSTIMESTAMP, 3, gpsData.mTimestamp, + TIFF_IFD_GPSINFO), env, TAG_GPSTIMESTAMP, writer); + } + + { + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_GPSDATESTAMP, + GpsData::GPS_DATE_LENGTH, gpsData.mDate, TIFF_IFD_GPSINFO), env, + TAG_GPSDATESTAMP, writer); + } + } + + + if (nativeContext->hasThumbnail()) { + if (!writer->hasIfd(TIFF_IFD_SUB1)) { + if (writer->addSubIfd(TIFF_IFD_0, TIFF_IFD_SUB1) != OK) { + ALOGE("%s: Failed to add SubIFD %u to IFD %u", __FUNCTION__, TIFF_IFD_SUB1, + TIFF_IFD_0); + jniThrowException(env, "java/lang/IllegalStateException", "Failed to add SubIFD"); + return nullptr; + } + } + + Vector<uint16_t> tagsToMove; + tagsToMove.add(TAG_ORIENTATION); + tagsToMove.add(TAG_NEWSUBFILETYPE); + tagsToMove.add(TAG_ACTIVEAREA); + tagsToMove.add(TAG_BITSPERSAMPLE); + tagsToMove.add(TAG_COMPRESSION); + tagsToMove.add(TAG_IMAGEWIDTH); + tagsToMove.add(TAG_IMAGELENGTH); + tagsToMove.add(TAG_PHOTOMETRICINTERPRETATION); + tagsToMove.add(TAG_BLACKLEVEL); + tagsToMove.add(TAG_BLACKLEVELREPEATDIM); + tagsToMove.add(TAG_SAMPLESPERPIXEL); + tagsToMove.add(TAG_PLANARCONFIGURATION); + tagsToMove.add(TAG_CFAREPEATPATTERNDIM); + tagsToMove.add(TAG_CFAPATTERN); + tagsToMove.add(TAG_CFAPLANECOLOR); + tagsToMove.add(TAG_CFALAYOUT); + tagsToMove.add(TAG_XRESOLUTION); + tagsToMove.add(TAG_YRESOLUTION); + tagsToMove.add(TAG_RESOLUTIONUNIT); + tagsToMove.add(TAG_WHITELEVEL); + tagsToMove.add(TAG_DEFAULTSCALE); + tagsToMove.add(TAG_DEFAULTCROPORIGIN); + tagsToMove.add(TAG_DEFAULTCROPSIZE); + tagsToMove.add(TAG_OPCODELIST2); + tagsToMove.add(TAG_OPCODELIST3); + + if (moveEntries(writer, TIFF_IFD_0, TIFF_IFD_SUB1, tagsToMove) != OK) { + jniThrowException(env, "java/lang/IllegalStateException", "Failed to move entries"); + return nullptr; + } + + // Make sure both IFDs get the same orientation tag + sp<TiffEntry> orientEntry = writer->getEntry(TAG_ORIENTATION, TIFF_IFD_SUB1); + if (orientEntry.get() != nullptr) { + writer->addEntry(orientEntry, TIFF_IFD_0); + } + + // Setup thumbnail tags + + { + // Set photometric interpretation + uint16_t interpretation = 2; // RGB + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_PHOTOMETRICINTERPRETATION, 1, + &interpretation, TIFF_IFD_0), env, TAG_PHOTOMETRICINTERPRETATION, writer); + } + + { + // Set planar configuration + uint16_t config = 1; // Chunky + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_PLANARCONFIGURATION, 1, &config, + TIFF_IFD_0), env, TAG_PLANARCONFIGURATION, writer); + } + + { + // Set samples per pixel + uint16_t samples = SAMPLES_PER_RGB_PIXEL; + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_SAMPLESPERPIXEL, 1, &samples, + TIFF_IFD_0), env, TAG_SAMPLESPERPIXEL, writer); + } + + { + // Set bits per sample + uint16_t bits = BITS_PER_RGB_SAMPLE; + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_BITSPERSAMPLE, 1, &bits, TIFF_IFD_0), + env, TAG_BITSPERSAMPLE, writer); + } + + { + // Set subfiletype + uint32_t subfileType = 1; // Thumbnail image + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_NEWSUBFILETYPE, 1, &subfileType, + TIFF_IFD_0), env, TAG_NEWSUBFILETYPE, writer); + } + + { + // Set compression + uint16_t compression = 1; // None + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_COMPRESSION, 1, &compression, + TIFF_IFD_0), env, TAG_COMPRESSION, writer); + } + + { + // Set dimensions + uint32_t uWidth = nativeContext->getThumbnailWidth(); + uint32_t uHeight = nativeContext->getThumbnailHeight(); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_IMAGEWIDTH, 1, &uWidth, TIFF_IFD_0), + env, TAG_IMAGEWIDTH, writer); + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_IMAGELENGTH, 1, &uHeight, TIFF_IFD_0), + env, TAG_IMAGELENGTH, writer); + } + + { + // x resolution + uint32_t xres[] = { 72, 1 }; // default 72 ppi + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_XRESOLUTION, 1, xres, TIFF_IFD_0), + env, TAG_XRESOLUTION, writer); + + // y resolution + uint32_t yres[] = { 72, 1 }; // default 72 ppi + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_YRESOLUTION, 1, yres, TIFF_IFD_0), + env, TAG_YRESOLUTION, writer); + + uint16_t unit = 2; // inches + BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_RESOLUTIONUNIT, 1, &unit, TIFF_IFD_0), + env, TAG_RESOLUTIONUNIT, writer); + } + } + + if (writer->addStrip(TIFF_IFD_0) != OK) { + ALOGE("%s: Could not setup thumbnail strip tags.", __FUNCTION__); + jniThrowException(env, "java/lang/IllegalStateException", + "Failed to setup thumbnail strip tags."); + return nullptr; + } + + if (writer->hasIfd(TIFF_IFD_SUB1)) { + if (writer->addStrip(TIFF_IFD_SUB1) != OK) { + ALOGE("%s: Could not main image strip tags.", __FUNCTION__); + jniThrowException(env, "java/lang/IllegalStateException", + "Failed to setup main image strip tags."); + return nullptr; + } + } + return writer; } static void DngCreator_destroy(JNIEnv* env, jobject thiz) { ALOGV("%s:", __FUNCTION__); - DngCreator_setNativeContext(env, thiz, NULL); + DngCreator_setNativeContext(env, thiz, nullptr); } static void DngCreator_nativeSetOrientation(JNIEnv* env, jobject thiz, jint orient) { ALOGV("%s:", __FUNCTION__); - TiffWriter* writer = DngCreator_getCreator(env, thiz); - if (writer == NULL) { + NativeContext* context = DngCreator_getNativeContext(env, thiz); + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "setOrientation called with uninitialized DngCreator"); @@ -1622,138 +1964,73 @@ static void DngCreator_nativeSetOrientation(JNIEnv* env, jobject thiz, jint orie } uint16_t orientation = static_cast<uint16_t>(orient); - BAIL_IF_INVALID(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_0), env, - TAG_ORIENTATION, writer); - - // Set main image orientation also if in a separate IFD - if (writer->hasIfd(TIFF_IFD_SUB1)) { - BAIL_IF_INVALID(writer->addEntry(TAG_ORIENTATION, 1, &orientation, TIFF_IFD_SUB1), env, - TAG_ORIENTATION, writer); - } + context->setOrientation(orientation); } static void DngCreator_nativeSetDescription(JNIEnv* env, jobject thiz, jstring description) { ALOGV("%s:", __FUNCTION__); - TiffWriter* writer = DngCreator_getCreator(env, thiz); - if (writer == NULL) { + NativeContext* context = DngCreator_getNativeContext(env, thiz); + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "setDescription called with uninitialized DngCreator"); return; } - const char* desc = env->GetStringUTFChars(description, NULL); - size_t len = strlen(desc) + 1; - - if (writer->addEntry(TAG_IMAGEDESCRIPTION, len, - reinterpret_cast<const uint8_t*>(desc), TIFF_IFD_0) != OK) { - jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", - "Invalid metadata for tag %x", TAG_IMAGEDESCRIPTION); - } - + const char* desc = env->GetStringUTFChars(description, nullptr); + context->setDescription(String8(desc)); env->ReleaseStringUTFChars(description, desc); } -static void DngCreator_nativeSetGpsTags(JNIEnv* env, jobject thiz, jintArray latTag, jstring latRef, - jintArray longTag, jstring longRef, jstring dateTag, jintArray timeTag) { +static void DngCreator_nativeSetGpsTags(JNIEnv* env, jobject thiz, jintArray latTag, + jstring latRef, jintArray longTag, jstring longRef, jstring dateTag, jintArray timeTag) { ALOGV("%s:", __FUNCTION__); - TiffWriter* writer = DngCreator_getCreator(env, thiz); - if (writer == NULL) { + NativeContext* context = DngCreator_getNativeContext(env, thiz); + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "setGpsTags called with uninitialized DngCreator"); return; } - if (!writer->hasIfd(TIFF_IFD_GPSINFO)) { - if (writer->addSubIfd(TIFF_IFD_0, TIFF_IFD_GPSINFO, TiffWriter::GPSINFO) != OK) { - ALOGE("%s: Failed to add GpsInfo IFD %u to IFD %u", __FUNCTION__, TIFF_IFD_GPSINFO, - TIFF_IFD_0); - jniThrowException(env, "java/lang/IllegalStateException", "Failed to add GPSINFO"); - return; - } - } + GpsData data; - const jsize GPS_VALUE_LENGTH = 6; jsize latLen = env->GetArrayLength(latTag); jsize longLen = env->GetArrayLength(longTag); jsize timeLen = env->GetArrayLength(timeTag); - if (latLen != GPS_VALUE_LENGTH) { + if (latLen != GpsData::GPS_VALUE_LENGTH) { jniThrowException(env, "java/lang/IllegalArgumentException", "invalid latitude tag length"); return; - } else if (longLen != GPS_VALUE_LENGTH) { + } else if (longLen != GpsData::GPS_VALUE_LENGTH) { jniThrowException(env, "java/lang/IllegalArgumentException", "invalid longitude tag length"); return; - } else if (timeLen != GPS_VALUE_LENGTH) { + } else if (timeLen != GpsData::GPS_VALUE_LENGTH) { jniThrowException(env, "java/lang/IllegalArgumentException", "invalid time tag length"); return; } - uint32_t latitude[GPS_VALUE_LENGTH]; - uint32_t longitude[GPS_VALUE_LENGTH]; - uint32_t timestamp[GPS_VALUE_LENGTH]; - - env->GetIntArrayRegion(latTag, 0, static_cast<jsize>(GPS_VALUE_LENGTH), - reinterpret_cast<jint*>(&latitude)); - env->GetIntArrayRegion(longTag, 0, static_cast<jsize>(GPS_VALUE_LENGTH), - reinterpret_cast<jint*>(&longitude)); - env->GetIntArrayRegion(timeTag, 0, static_cast<jsize>(GPS_VALUE_LENGTH), - reinterpret_cast<jint*>(×tamp)); - - const jsize GPS_REF_LENGTH = 2; - const jsize GPS_DATE_LENGTH = 11; - uint8_t latitudeRef[GPS_REF_LENGTH]; - uint8_t longitudeRef[GPS_REF_LENGTH]; - uint8_t date[GPS_DATE_LENGTH]; - - env->GetStringUTFRegion(latRef, 0, 1, reinterpret_cast<char*>(&latitudeRef)); - latitudeRef[GPS_REF_LENGTH - 1] = '\0'; - env->GetStringUTFRegion(longRef, 0, 1, reinterpret_cast<char*>(&longitudeRef)); - longitudeRef[GPS_REF_LENGTH - 1] = '\0'; - - env->GetStringUTFRegion(dateTag, 0, GPS_DATE_LENGTH - 1, reinterpret_cast<char*>(&date)); - date[GPS_DATE_LENGTH - 1] = '\0'; - - { - uint8_t version[] = {2, 3, 0, 0}; - BAIL_IF_INVALID(writer->addEntry(TAG_GPSVERSIONID, 4, version, - TIFF_IFD_GPSINFO), env, TAG_GPSVERSIONID, writer); - } - - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSLATITUDEREF, GPS_REF_LENGTH, latitudeRef, - TIFF_IFD_GPSINFO), env, TAG_GPSLATITUDEREF, writer); - } - - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSLONGITUDEREF, GPS_REF_LENGTH, longitudeRef, - TIFF_IFD_GPSINFO), env, TAG_GPSLONGITUDEREF, writer); - } - - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSLATITUDE, 3, latitude, - TIFF_IFD_GPSINFO), env, TAG_GPSLATITUDE, writer); - } + env->GetIntArrayRegion(latTag, 0, static_cast<jsize>(GpsData::GPS_VALUE_LENGTH), + reinterpret_cast<jint*>(&data.mLatitude)); + env->GetIntArrayRegion(longTag, 0, static_cast<jsize>(GpsData::GPS_VALUE_LENGTH), + reinterpret_cast<jint*>(&data.mLongitude)); + env->GetIntArrayRegion(timeTag, 0, static_cast<jsize>(GpsData::GPS_VALUE_LENGTH), + reinterpret_cast<jint*>(&data.mTimestamp)); - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSLONGITUDE, 3, longitude, - TIFF_IFD_GPSINFO), env, TAG_GPSLONGITUDE, writer); - } - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSTIMESTAMP, 3, timestamp, - TIFF_IFD_GPSINFO), env, TAG_GPSTIMESTAMP, writer); - } + env->GetStringUTFRegion(latRef, 0, 1, reinterpret_cast<char*>(&data.mLatitudeRef)); + data.mLatitudeRef[GpsData::GPS_REF_LENGTH - 1] = '\0'; + env->GetStringUTFRegion(longRef, 0, 1, reinterpret_cast<char*>(&data.mLongitudeRef)); + data.mLongitudeRef[GpsData::GPS_REF_LENGTH - 1] = '\0'; + env->GetStringUTFRegion(dateTag, 0, GpsData::GPS_DATE_LENGTH - 1, + reinterpret_cast<char*>(&data.mDate)); + data.mDate[GpsData::GPS_DATE_LENGTH - 1] = '\0'; - { - BAIL_IF_INVALID(writer->addEntry(TAG_GPSDATESTAMP, GPS_DATE_LENGTH, date, - TIFF_IFD_GPSINFO), env, TAG_GPSDATESTAMP, writer); - } + context->setGpsData(data); } static void DngCreator_nativeSetThumbnail(JNIEnv* env, jobject thiz, jobject buffer, jint width, @@ -1761,8 +2038,7 @@ static void DngCreator_nativeSetThumbnail(JNIEnv* env, jobject thiz, jobject buf ALOGV("%s:", __FUNCTION__); NativeContext* context = DngCreator_getNativeContext(env, thiz); - TiffWriter* writer = DngCreator_getCreator(env, thiz); - if (writer == NULL || context == NULL) { + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "setThumbnail called with uninitialized DngCreator"); @@ -1779,147 +2055,12 @@ static void DngCreator_nativeSetThumbnail(JNIEnv* env, jobject thiz, jobject buf } uint8_t* pixelBytes = reinterpret_cast<uint8_t*>(env->GetDirectBufferAddress(buffer)); - if (pixelBytes == NULL) { + if (pixelBytes == nullptr) { ALOGE("%s: Could not get native ByteBuffer", __FUNCTION__); jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid ByteBuffer"); return; } - if (!writer->hasIfd(TIFF_IFD_SUB1)) { - if (writer->addSubIfd(TIFF_IFD_0, TIFF_IFD_SUB1) != OK) { - ALOGE("%s: Failed to add SubIFD %u to IFD %u", __FUNCTION__, TIFF_IFD_SUB1, - TIFF_IFD_0); - jniThrowException(env, "java/lang/IllegalStateException", "Failed to add SubIFD"); - return; - } - - Vector<uint16_t> tagsToMove; - tagsToMove.add(TAG_ORIENTATION); - tagsToMove.add(TAG_NEWSUBFILETYPE); - tagsToMove.add(TAG_BITSPERSAMPLE); - tagsToMove.add(TAG_COMPRESSION); - tagsToMove.add(TAG_IMAGEWIDTH); - tagsToMove.add(TAG_IMAGELENGTH); - tagsToMove.add(TAG_PHOTOMETRICINTERPRETATION); - tagsToMove.add(TAG_BLACKLEVEL); - tagsToMove.add(TAG_BLACKLEVELREPEATDIM); - tagsToMove.add(TAG_SAMPLESPERPIXEL); - tagsToMove.add(TAG_PLANARCONFIGURATION); - tagsToMove.add(TAG_CFAREPEATPATTERNDIM); - tagsToMove.add(TAG_CFAPATTERN); - tagsToMove.add(TAG_CFAPLANECOLOR); - tagsToMove.add(TAG_CFALAYOUT); - tagsToMove.add(TAG_XRESOLUTION); - tagsToMove.add(TAG_YRESOLUTION); - tagsToMove.add(TAG_RESOLUTIONUNIT); - tagsToMove.add(TAG_WHITELEVEL); - tagsToMove.add(TAG_DEFAULTSCALE); - tagsToMove.add(TAG_ROWSPERSTRIP); - tagsToMove.add(TAG_STRIPBYTECOUNTS); - tagsToMove.add(TAG_STRIPOFFSETS); - tagsToMove.add(TAG_DEFAULTCROPORIGIN); - tagsToMove.add(TAG_DEFAULTCROPSIZE); - tagsToMove.add(TAG_OPCODELIST2); - tagsToMove.add(TAG_OPCODELIST3); - - if (moveEntries(writer, TIFF_IFD_0, TIFF_IFD_SUB1, tagsToMove) != OK) { - jniThrowException(env, "java/lang/IllegalStateException", "Failed to move entries"); - return; - } - - // Make sure both IFDs get the same orientation tag - sp<TiffEntry> orientEntry = writer->getEntry(TAG_ORIENTATION, TIFF_IFD_SUB1); - if (orientEntry != NULL) { - writer->addEntry(orientEntry, TIFF_IFD_0); - } - } - - // Setup thumbnail tags - - { - // Set photometric interpretation - uint16_t interpretation = 2; // RGB - BAIL_IF_INVALID(writer->addEntry(TAG_PHOTOMETRICINTERPRETATION, 1, &interpretation, - TIFF_IFD_0), env, TAG_PHOTOMETRICINTERPRETATION, writer); - } - - { - // Set planar configuration - uint16_t config = 1; // Chunky - BAIL_IF_INVALID(writer->addEntry(TAG_PLANARCONFIGURATION, 1, &config, TIFF_IFD_0), - env, TAG_PLANARCONFIGURATION, writer); - } - - { - // Set samples per pixel - uint16_t samples = SAMPLES_PER_RGB_PIXEL; - BAIL_IF_INVALID(writer->addEntry(TAG_SAMPLESPERPIXEL, 1, &samples, TIFF_IFD_0), - env, TAG_SAMPLESPERPIXEL, writer); - } - - { - // Set bits per sample - uint16_t bits = BITS_PER_RGB_SAMPLE; - BAIL_IF_INVALID(writer->addEntry(TAG_BITSPERSAMPLE, 1, &bits, TIFF_IFD_0), env, - TAG_BITSPERSAMPLE, writer); - } - - { - // Set subfiletype - uint32_t subfileType = 1; // Thumbnail image - BAIL_IF_INVALID(writer->addEntry(TAG_NEWSUBFILETYPE, 1, &subfileType, TIFF_IFD_0), env, - TAG_NEWSUBFILETYPE, writer); - } - - { - // Set compression - uint16_t compression = 1; // None - BAIL_IF_INVALID(writer->addEntry(TAG_COMPRESSION, 1, &compression, TIFF_IFD_0), env, - TAG_COMPRESSION, writer); - } - - { - // Set dimensions - uint32_t uWidth = static_cast<uint32_t>(width); - uint32_t uHeight = static_cast<uint32_t>(height); - BAIL_IF_INVALID(writer->addEntry(TAG_IMAGEWIDTH, 1, &uWidth, TIFF_IFD_0), env, - TAG_IMAGEWIDTH, writer); - BAIL_IF_INVALID(writer->addEntry(TAG_IMAGELENGTH, 1, &uHeight, TIFF_IFD_0), env, - TAG_IMAGELENGTH, writer); - } - - { - // x resolution - uint32_t xres[] = { 72, 1 }; // default 72 ppi - BAIL_IF_INVALID(writer->addEntry(TAG_XRESOLUTION, 1, xres, TIFF_IFD_0), - env, TAG_XRESOLUTION, writer); - - // y resolution - uint32_t yres[] = { 72, 1 }; // default 72 ppi - BAIL_IF_INVALID(writer->addEntry(TAG_YRESOLUTION, 1, yres, TIFF_IFD_0), - env, TAG_YRESOLUTION, writer); - - uint16_t unit = 2; // inches - BAIL_IF_INVALID(writer->addEntry(TAG_RESOLUTIONUNIT, 1, &unit, TIFF_IFD_0), - env, TAG_RESOLUTIONUNIT, writer); - } - - { - // Setup data strips - if (writer->addStrip(TIFF_IFD_0) != OK) { - ALOGE("%s: Could not setup thumbnail strip tags.", __FUNCTION__); - jniThrowException(env, "java/lang/IllegalStateException", - "Failed to setup thumbnail strip tags."); - return; - } - if (writer->addStrip(TIFF_IFD_SUB1) != OK) { - ALOGE("%s: Could not main image strip tags.", __FUNCTION__); - jniThrowException(env, "java/lang/IllegalStateException", - "Failed to setup main image strip tags."); - return; - } - } - if (!context->setThumbnail(pixelBytes, width, height)) { jniThrowException(env, "java/lang/IllegalStateException", "Failed to set thumbnail."); @@ -1947,16 +2088,20 @@ static void DngCreator_nativeWriteImage(JNIEnv* env, jobject thiz, jobject outSt return; } - TiffWriter* writer = DngCreator_getCreator(env, thiz); NativeContext* context = DngCreator_getNativeContext(env, thiz); - if (writer == NULL || context == NULL) { + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "Write called with uninitialized DngCreator"); return; } + sp<TiffWriter> writer = DngCreator_setup(env, thiz, uWidth, uHeight); - // Validate DNG header + if (writer.get() == nullptr) { + return; + } + + // Validate DNG size if (!validateDngHeader(env, writer, *(context->getCharacteristics()), width, height)) { return; } @@ -1991,7 +2136,7 @@ static void DngCreator_nativeWriteImage(JNIEnv* env, jobject thiz, jobject outSt } uint8_t* pixelBytes = reinterpret_cast<uint8_t*>(env->GetDirectBufferAddress(inBuffer)); - if (pixelBytes == NULL) { + if (pixelBytes == nullptr) { ALOGE("%s: Could not get native ByteBuffer", __FUNCTION__); jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid ByteBuffer"); return; @@ -2051,16 +2196,20 @@ static void DngCreator_nativeWriteInputStream(JNIEnv* env, jobject thiz, jobject return; } - TiffWriter* writer = DngCreator_getCreator(env, thiz); NativeContext* context = DngCreator_getNativeContext(env, thiz); - if (writer == NULL || context == NULL) { + if (context == nullptr) { ALOGE("%s: Failed to initialize DngCreator", __FUNCTION__); jniThrowException(env, "java/lang/AssertionError", "Write called with uninitialized DngCreator"); return; } + sp<TiffWriter> writer = DngCreator_setup(env, thiz, uWidth, uHeight); + + if (writer.get() == nullptr) { + return; + } - // Validate DNG header + // Validate DNG size if (!validateDngHeader(env, writer, *(context->getCharacteristics()), width, height)) { return; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index c34160c88e4a..4471af06d38c 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2774,6 +2774,14 @@ </intent-filter> </receiver> + <receiver android:name="com.android.server.updates.ApnDbInstallReceiver" + android:permission="android.permission.UPDATE_CONFIG"> + <intent-filter> + <action android:name="android.intent.action.UPDATE_APN_DB" /> + <data android:scheme="content" android:host="*" android:mimeType="*/*" /> + </intent-filter> + </receiver> + <receiver android:name="com.android.server.updates.CarrierProvisioningUrlsInstallReceiver" android:permission="android.permission.UPDATE_CONFIG"> <intent-filter> diff --git a/core/res/res/layout/app_error_dialog_dont_show_again.xml b/core/res/res/layout/app_error_dialog_dont_show_again.xml new file mode 100644 index 000000000000..ba79ecd1fa8c --- /dev/null +++ b/core/res/res/layout/app_error_dialog_dont_show_again.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2015, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingStart="14dp" + android:paddingEnd="10dp" + android:gravity="center_vertical" + > + <CheckBox + android:id="@+id/checkbox" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + <TextView + android:id="@+id/text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + /> + +</LinearLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index b404906c8770..ea88d1ebce0d 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdrukikoon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lees sinkroniseer-instellings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Laat die program toe om die sinkroniseringinstellings van \'n rekening te lees. Byvoorbeeld, dit kan bepaal of die People-program met \'n rekening gesinkroniseer is."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"wissel tussen sinkronisasie aan en af"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ongelukkig het <xliff:g id="APPLICATION">%1$s</xliff:g> gestop."</string> <string name="aerr_process" msgid="4507058997035697579">"Ongelukkig het die proses <xliff:g id="PROCESS">%1$s</xliff:g> gestop."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reageer nie.\n\nWil jy dit sluit?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiwiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> reageer nie.\n\nWil jy dit afsluit?"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 69cadfa994a9..9ff3f03f1b5b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ጣት <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"የጣት አሻራ አዶ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"የሥምሪያ ቅንብሮች አንብብ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"መተግበሪያው የአንድ መለያ የማመሳሰል ቅንብሮችን እንዲያነብ ይፈቅድለታል። ለምሳሌ ይህ የሰዎች መተግበሪያ ከመለያ ጋር መመሳሰሉን አለመመሳሰሉን ሊወስን ይችላል።"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ማመሳሰያ በማብራትና በማጥፋት መካከል ቀያይር"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"መጥፎ ዕድል ሆኖ፣ <xliff:g id="APPLICATION">%1$s</xliff:g> አቁሞዋል፡፡"</string> <string name="aerr_process" msgid="4507058997035697579">"መጥፎ ዕድል ሆኖ፣ ይሄ ሂደት <xliff:g id="PROCESS">%1$s</xliff:g> ቆሞዋል፡፡"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ምላሽ እየሰጠ አይደለም።\n\n መዝጋት ይፈልጋሉ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"እንቅስቃሴ <xliff:g id="ACTIVITY">%1$s</xliff:g> ምላሽ እየሰጠ አይደለም።\n\n መዝጋት ይፈልጋሉ?"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index c3b32ccedaab..80d6cb4d6584 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -438,6 +438,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"الإصبع <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"رمز بصمة الإصبع"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"للسماح للتطبيق بقراءة الإعدادات المتزامنة لحساب ما. على سبيل المثال، يمكن أن يؤدي هذا إلى تحديد ما إذا تمت مزامنة تطبيق \"الأشخاص\" مع حساب ما."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"التبديل بين تشغيل المزامنة وإيقافها"</string> @@ -916,6 +917,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"للأسف، توقف <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"للأسف، توقفت العملية <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> لا يستجيب.\n\nهل تريد إغلاقه؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"النشاط <xliff:g id="ACTIVITY">%1$s</xliff:g> لا يستجيب.\n\nهل تريد إغلاقه؟"</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 6e09434894eb..f0567e3177ed 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Barmaq <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmaq izi ikonası"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Təəssüf ki, <xliff:g id="APPLICATION">%1$s</xliff:g> dayandı."</string> <string name="aerr_process" msgid="4507058997035697579">"Təəssüf ki, <xliff:g id="PROCESS">%1$s</xliff:g> prosesi dayandı."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> cavab vermir.\n\nOnu bağlamaq istəyirsiniz?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> aktivitisi cavab vermir. \n\nOnu bağlamaq istəyirsiniz?"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d70b5f3fc0f2..5348f132f81b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Пръст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатък"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Разрешава на приложението да чете настройките за синхронизиране на профил. Например това може да определи дали приложението Хора е синхронизирано с даден профил."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"включване и изключване на синхронизирането"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"За съжаление <xliff:g id="APPLICATION">%1$s</xliff:g> спря."</string> <string name="aerr_process" msgid="4507058997035697579">"За съжаление процесът <xliff:g id="PROCESS">%1$s</xliff:g> спря."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Приложението „<xliff:g id="APPLICATION">%2$s</xliff:g>“ не отговаря.\n\nИскате ли да го затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Дейността „<xliff:g id="ACTIVITY">%1$s</xliff:g>“ не отговаря.\n\nИскате ли да я затворите?"</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 8f9c8b98526e..b08928d43b4a 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"আঙ্গুল <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"আঙ্গুলের ছাপ আইকন"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"সিঙ্ক সেটিংস পড়ে"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"অ্যাপ্লিকেশানটিকে একটি অ্যাকাউন্টের জন্য সিঙ্ক সেটিংস পড়ার অনুমতি দেয়৷ উদাহরণস্বরূপ, \'পিপল\' অ্যাপ্লিকেশানটি কোনো অ্যাকাউন্টের সাথে সিঙ্ক করা আছে কিনা তা নির্ধারণ করতে পারে৷"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"সমন্বয় চালু এবং বন্ধ করা টগল করুন"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"দুর্ভাগ্যবশত, <xliff:g id="APPLICATION">%1$s</xliff:g> বন্ধ হয়েছে৷"</string> <string name="aerr_process" msgid="4507058997035697579">"দুর্ভাগ্যবশত, <xliff:g id="PROCESS">%1$s</xliff:g> প্রক্রিয়াটি বন্ধ হয়েছে৷"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> সাড়া দিচ্ছে না৷\n\nআপনি কি এটি বন্ধ করতে চান?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> কার্যকলাপ সাড়া দিচ্ছে না৷\n\nআপনি কি এটি বন্ধ করতে চান?"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 558c3f506eea..4e9591571df9 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dit <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona d\'empremta digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar o desactivar la sincronització"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> s\'ha aturat."</string> <string name="aerr_process" msgid="4507058997035697579">"El procés <xliff:g id="PROCESS">%1$s</xliff:g> s\'ha aturat."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> no respon.\n\nVols tancar-la?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activitat <xliff:g id="ACTIVITY">%1$s</xliff:g> no respon.\n\nVols tancar-la?"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 632efa9a3942..77ae21600be1 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čtení nastavení synchronizace"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikaci číst nastavení synchronizace v účtu. Může například určit, zda je s účtem synchronizována aplikace Lidé."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vypnutí nebo zapnutí synchronizace"</string> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> bohužel přestala pracovat."</string> <string name="aerr_process" msgid="4507058997035697579">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> byl bohužel ukončen."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikace <xliff:g id="APPLICATION">%2$s</xliff:g> nereaguje.\n\nChcete ji ukončit?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivita <xliff:g id="ACTIVITY">%1$s</xliff:g> nereaguje.\n\nChcete ji ukončit?"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 08f5148553f0..9649fbfefd0a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"læse indstillinger for synkronisering"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillader, at appen kan læse synkroniseringsindstillingerne for en konto. Denne tilladelse kan f.eks. fastslå, om appen Personer er synkroniseret med en konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering til og fra"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Applikationen <xliff:g id="APPLICATION">%1$s</xliff:g> er desværre stoppet."</string> <string name="aerr_process" msgid="4507058997035697579">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> er desværre stoppet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarer ikke.\n\nVil du lukke den?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarer ikke.\n\nVil du at lukke den?"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 74c0be365382..203a9485ddec 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerabdruck-Symbol"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ermöglicht der App, die Synchronisierungseinstellungen eines Kontos zu lesen. Beispielsweise kann damit festgestellt werden, ob Kontakte mit einem Konto synchronisiert werden."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Synchronisierung aktivieren oder deaktivieren"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"\"<xliff:g id="APPLICATION">%1$s</xliff:g>\" wurde beendet."</string> <string name="aerr_process" msgid="4507058997035697579">"Der Prozess \"<xliff:g id="PROCESS">%1$s</xliff:g>\" wurde beendet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reagiert nicht.\n\nMöchten Sie die App schließen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivität \"<xliff:g id="ACTIVITY">%1$s</xliff:g>\" reagiert nicht.\n\nMöchten Sie sie beenden?"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 885cb1e79527..cdd246a319ab 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Δάχτυλο <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ανάγνωση ρυθμίσεων συγχρονισμού"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"εναλλαγή ενεργοποίησης και απενεργοποίησης συγχρονισμού"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Δυστυχώς, η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> έχει σταματήσει."</string> <string name="aerr_process" msgid="4507058997035697579">"Δυστυχώς, η διαδικασία <xliff:g id="PROCESS">%1$s</xliff:g> έχει σταματήσει."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Η εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g> δεν ανταποκρίνεται.\n\nΘέλετε να την κλείσετε;"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Η δραστηριότητα <xliff:g id="ACTIVITY">%1$s</xliff:g> δεν ανταποκρίνεται.\n\nΘέλετε να την κλείσετε;"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9b0616fab76b..8bb3cc643897 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9b0616fab76b..8bb3cc643897 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 9b0616fab76b..8bb3cc643897 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Unfortunately, <xliff:g id="APPLICATION">%1$s</xliff:g> has stopped."</string> <string name="aerr_process" msgid="4507058997035697579">"Unfortunately, the process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> isn\'t responding.\n\nDo you want to close it?"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e7c9e22a94c2..5d0977874e28 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícono de huella digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Este permiso permite que la aplicación consulte la configuración de sincronización de una cuenta. Esto permite, por ejemplo, determinar si la aplicación Personas está sincronizada con una cuenta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Lamentablemente, la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> se detuvo."</string> <string name="aerr_process" msgid="4507058997035697579">"Lamentablemente, el proceso <xliff:g id="PROCESS">%1$s</xliff:g> se detuvo."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> no responde.\n\n¿Deseas cerrarla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> no responde.\n\n¿Deseas cerrarla?"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 80afd2d3c1a6..b0b242f1f0dc 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icono de huella digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que la aplicación consulte la configuración de sincronización de una cuenta. La aplicación puede utilizar este permiso, por ejemplo, para determinar si la aplicación Contactos está sincronizada con una cuenta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Se ha detenido la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Se ha detenido el proceso <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"La aplicación <xliff:g id="APPLICATION">%2$s</xliff:g> no responde.\n\n¿Quieres cerrarla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> no responde.\n\n¿Quieres cerrarla?"</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index f8a875819eb2..ca1bb7f65174 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Sõrm <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sõrmejälje ikoon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"loe sünkroonimisseadeid"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Võimaldab rakendusel lugeda konto sünkroonimisseadeid. Näiteks võib see määrata, kas rakendus Inimesed on kontoga sünkroonitud."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"lülitage sünkroonimine sisse ja välja"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Kahjuks on rakendus <xliff:g id="APPLICATION">%1$s</xliff:g> peatunud."</string> <string name="aerr_process" msgid="4507058997035697579">"Kahjuks on protsess <xliff:g id="PROCESS">%1$s</xliff:g> peatunud."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ei vasta.\n\nKas soovite selle sulgeda?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Tegevus <xliff:g id="ACTIVITY">%1$s</xliff:g> ei vasta.\n\nKas soovite selle sulgeda?"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index a519d221cc4c..81dfbe016c20 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> hatza"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Hatz-markaren ikonoa"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Irakurri sinkronizazio-ezarpenak"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinkronizazioa aktibatzea eta desaktibatzea"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Zoritxarrez, <xliff:g id="APPLICATION">%1$s</xliff:g> aplikazioa gelditu egin da."</string> <string name="aerr_process" msgid="4507058997035697579">"Zoritxarrez, <xliff:g id="PROCESS">%1$s</xliff:g> prozesua gelditu egin da."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> aplikazioak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> jarduerak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 28e22604d310..345f16a63b4d 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"نماد اثر انگشت"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگامسازی"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"به برنامه اجازه میدهد تنظیمات را برای یک حساب بخواند. بهعنوان مثال، این ویژگی میتواند تعیین کند آیا حساب «افراد» شما با یک حساب همگامسازی شده است."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"تغییر وضعیت همگامسازی بین فعال و غیرفعال"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"متأسفانه، <xliff:g id="APPLICATION">%1$s</xliff:g> متوقف شده است."</string> <string name="aerr_process" msgid="4507058997035697579">"متأسفانه، پردازش <xliff:g id="PROCESS">%1$s</xliff:g> متوقف شده است."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> پاسخ نمیدهد.\n\nآیا میخواهید آنرا ببندید؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"فعالیت <xliff:g id="ACTIVITY">%1$s</xliff:g> پاسخ نمیدهد.\n\nآیا میخواهید آن را ببندید؟"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 1cb9ff2b6337..368b8d2b003a 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Sormi <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sormenjälkikuvake"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Antaa sovelluksen lukea tilien synkronointiasetuksia. Sovellus voi esimerkiksi määrittää, onko Henkilöt-sovellus synkronoitu tilin kanssa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ota synkronointi käyttöön tai poista se käytöstä"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> on pysähtynyt."</string> <string name="aerr_process" msgid="4507058997035697579">"Prosessi <xliff:g id="PROCESS">%1$s</xliff:g> on pysähtynyt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ei vastaa.\n\nHaluatko sulkea sen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Toiminto <xliff:g id="ACTIVITY">%1$s</xliff:g> ei vastaa.\n\nHaluatko sulkea sen?"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 39f620491f2b..eaf61621ab56 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer ou désactiver la synchronisation"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"L\'application \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêtée."</string> <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter?"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 33f06ef14c7a..cab909969fe0 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer/désactiver la synchronisation"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"\"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêté."</string> <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas.\n\nVoulez-vous quitter ?"</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 65217c72672c..4f20a7a8bcc4 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona de impresión dixital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler a configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite á aplicación ler a configuración de sincronización dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se sincroniza cunha conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar e desactivar a sincronización"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Detívose a aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Detívose o proceso <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> non responde.\n\nQueres pechala?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A actividade <xliff:g id="ACTIVITY">%1$s</xliff:g> non responde.\n\nQueres pechala?"</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 397e17a3c90d..76ca425c5ff0 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"આંગળી <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ફિંગરપ્રિન્ટ આયકન"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"સમન્વયન સેટિંગ્સ વાંચો"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"એપ્લિકેશનને એકાઉન્ટ માટે સમન્વયન સેટિંગ્સને વાંચવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, આ એકાઉન્ટ સાથે લોકો એપ્લિકેશન સમન્વયિત થઈ છે કે કેમ તે નિર્ધારિત કરી શકે છે."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"સમન્વયન ચાલુ અને બંધ ટોગલ કરો"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"કમનસીબે, <xliff:g id="APPLICATION">%1$s</xliff:g> બંધ થઈ ગયું છે."</string> <string name="aerr_process" msgid="4507058997035697579">"કમનસીબે, <xliff:g id="PROCESS">%1$s</xliff:g> પ્રક્રિયા રોકાઈ ગઈ છે."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> જવાબ આપતી નથી.\n\nશું તમે તેને બંધ કરવા માંગો છો?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> પ્રવૃત્તિ પ્રતિસાદ આપતી નથી.\n\nશું તમે તેને બંધ કરવા માંગો છો?"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index a400fd5e8ea6..5c965bdb13af 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"अंगुली <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फ़िंगरप्रिंट आइकन"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समन्वयन सेटिंग पढ़ें"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ऐप्स को किसी खाते की समन्वयन सेटिंग पढ़ने देता है. उदाहरण के लिए, इससे यह निर्धारित किया जा सकता है कि लोग ऐप्स किसी खाते के साथ समन्वयित है या नहीं."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"समन्वयन बंद या चालू टॉगल करें"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्भाग्यवश, <xliff:g id="APPLICATION">%1$s</xliff:g> रुक गया है."</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्भाग्यवश, <xliff:g id="PROCESS">%1$s</xliff:g> प्रक्रिया रुक गई है."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> प्रतिसाद नहीं दे रहा है.\n\nक्या आप इसे बंद करना चाहते हैं?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> प्रतिसाद नहीं दे रही है.\n\nक्या आप इसे बंद करना चाहते हैं?"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 2baa1064710e..6f470c6c9b09 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogućuje čitanje postavki sinkronizacije za račun. Time se, primjerice, može utvrditi je li aplikacija Osobe sinkronizirana s računom."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"uključivanje/isključivanje sinkronizacije"</string> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Nažalost, aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> prekinula je s radom."</string> <string name="aerr_process" msgid="4507058997035697579">"Nažalost, zaustavljen je proces <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacija <xliff:g id="APPLICATION">%2$s</xliff:g> ne reagira.\n\nŽelite li je zatvoriti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivnost <xliff:g id="ACTIVITY">%1$s</xliff:g> ne reagira.\n\nŽelite li je zatvoriti?"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c96219841887..509b7258a1ff 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ujjlenyomat ikon"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lehetővé teszi az alkalmazás számára egy fiók szinkronizálási beállításainak beolvasását. Például ellenőrizheti, hogy a Személyek alkalmazás szinkronizálva van-e egy fiókkal."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"szinkronizálás be-és kikapcsolása"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"A(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazás sajnos leállt."</string> <string name="aerr_process" msgid="4507058997035697579">"Sajnos a <xliff:g id="PROCESS">%1$s</xliff:g> alkalmazás leállt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"A(z) <xliff:g id="APPLICATION">%2$s</xliff:g> nem válaszol.\n\nSzeretné bezárni?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A(z) <xliff:g id="ACTIVITY">%1$s</xliff:g> tevékenység nem válaszol.\n\nSzeretné bezárni?"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index a7b9b5bff491..83dfdcb3fb5e 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Մատնահետք <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ցավոք, <xliff:g id="APPLICATION">%1$s</xliff:g>-ը ընդհատվել է:"</string> <string name="aerr_process" msgid="4507058997035697579">"Ցավոք, <xliff:g id="PROCESS">%1$s</xliff:g> գործընթացը դադարել է:"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>-ը չի արձագանքում:\n\nՑանկանու՞մ եք փակել այն:"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> գործողությունը չի պատասխանում:\n\nՑանկանու՞մ եք այն փակել:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index d8396b5c28f4..d1e843c8ef2e 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon sidik jari"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Memungkinkan aplikasi membaca setelan sinkronisasi untuk sebuah akun. Misalnya, izin ini dapat menentukan apakah aplikasi Orang disinkronkan dengan sebuah akun."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"nyalakan dan matikan sinkronisasi"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Sayangnya, <xliff:g id="APPLICATION">%1$s</xliff:g> telah berhenti."</string> <string name="aerr_process" msgid="4507058997035697579">"Sayangnya, proses <xliff:g id="PROCESS">%1$s</xliff:g> telah berhenti."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> tidak menanggapi.\n\nAnda ingin menutupnya?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivitas <xliff:g id="ACTIVITY">%1$s</xliff:g> tidak menanggapi.\n\nAnda ingin menutupnya?"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 344eb8337085..d0bcd5cb3688 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Fingur <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lesa samstillingar"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leyfir forriti að lesa kosti samstillingar fyrir reikning. Þetta er til dæmis hægt að nota til að komast að því hvort forritið Fólk er samstillt við reikning."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kveikja og slökkva á samstillingu"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> lokaðist því miður."</string> <string name="aerr_process" msgid="4507058997035697579">"Forritið <xliff:g id="PROCESS">%1$s</xliff:g> lokaðist því miður."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarar ekki.\n\nViltu loka því?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aðgerðin <xliff:g id="ACTIVITY">%1$s</xliff:g> svarar ekki.\n\nViltu loka henni?"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 637b2fe403c1..0c5dcb5eddfc 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lettura impostazioni di sincronizz."</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Consente all\'applicazione di leggere le impostazioni di sincronizzazione per un account. Ad esempio, questa autorizzazione può determinare se l\'applicazione Persone è sincronizzata con un account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"attivazione e disattivazione della sincronizzazione"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"L\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g> si è bloccata in modo anomalo."</string> <string name="aerr_process" msgid="4507058997035697579">"Il processo <xliff:g id="PROCESS">%1$s</xliff:g> si è interrotto."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> non risponde.\n\nVuoi chiuderla?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'attività <xliff:g id="ACTIVITY">%1$s</xliff:g> non risponde.\n\nVuoi chiuderla?"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 590f7e835227..ffd65deb943f 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא את הגדרות הסינכרון"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"הפעלת וכיבוי סנכרון"</string> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"לצערנו, פעולת <xliff:g id="APPLICATION">%1$s</xliff:g> הופסקה."</string> <string name="aerr_process" msgid="4507058997035697579">"לצערנו, התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הופסק."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> אינו מגיב.\n\nתרצה לסגור אותו?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"הפעילות <xliff:g id="ACTIVITY">%1$s</xliff:g> אינה מגיבה.\n\nתרצה לסגור אותה?"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 05b1fd7f250d..454ae8817ca7 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"指紋<xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋アイコン"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"同期設定の読み取り"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"アカウントの同期設定の読み取りをアプリに許可します。たとえば、連絡帳アプリがアカウントと同期しているかどうかをアプリから特定できるようになります。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"同期のON/OFFの切り替え"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"問題が発生したため、<xliff:g id="APPLICATION">%1$s</xliff:g>を終了します。"</string> <string name="aerr_process" msgid="4507058997035697579">"問題が発生したため、プロセス「<xliff:g id="PROCESS">%1$s</xliff:g>」を終了します。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>は応答していません。\n\nこのアプリを終了しますか?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"操作「<xliff:g id="ACTIVITY">%1$s</xliff:g>」は応答していません。\n\nこの操作を終了しますか?"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 184b0e7dc08a..851100dd53af 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"თითი <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრონიზაციის პარამეტრების წაკითხვა"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"აპს შეეძლება, წაიკითხოს ანგარიშის სინქრონიზაციის პარამეტრები. მაგალითად, მას შეეძლება განსაზღვროს, არის თუ არა People აპი სინქრონიზებული ანგარიშთან."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"სინქრონიზაციის ჩართვა და გამორთვა"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"სამწუხაროდ, <xliff:g id="APPLICATION">%1$s</xliff:g> შეწყდა."</string> <string name="aerr_process" msgid="4507058997035697579">"სამწუხაროდ, პროცესი <xliff:g id="PROCESS">%1$s</xliff:g> შეწყდა."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> არ რეაგირებს.\n\nგსურთ, მისი დახურვა?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> აქტივობა არ რეაგირებს.\n\nგსურთ მისი დახურვა?"</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index c8fa7c215ec1..6fb9e0108169 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> саусағы"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Саусақ ізі белгішесі"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"синх параметрлерін оқу"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Қолданбаға есептік жазба синхрондау параметрлерін оқу мүмкіндігін береді. Мысалы, бұл арқылы People қолданбасының есептік жазбамен сихрондалғаны анықталуы мүмкін."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синх қосу және өшіру арасында ауысу"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Өкінішке орай, <xliff:g id="APPLICATION">%1$s</xliff:g> тоқтап қалды."</string> <string name="aerr_process" msgid="4507058997035697579">"Өкінішке орай, <xliff:g id="PROCESS">%1$s</xliff:g> үрдісі тоқтап қалды."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> жауап бермей жатыр.\n\nОны жабу керек пе?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> әрекеті жауап бермей жатыр.\n\nОны жабу керек пе?"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 97bd37530fab..2b577595786b 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"រូបតំណាងស្នាមម្រាមដៃ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"អានការកំណត់ធ្វើសមកាលកម្ម"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ឲ្យកម្មវិធីអានការកំណត់ធ្វើសមកាលកម្មសម្រាប់គណនី។ ឧទាហរណ៍ វាអាចកំណត់ថាតើកម្មវិធីត្រូវបានបើកជាមួយគណនីដែរឬទេ។"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"បិទ/បើកការធ្វើសមកាលកម្ម"</string> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ដោយបរាជ័យ <xliff:g id="APPLICATION">%1$s</xliff:g> បានបញ្ឈប់។"</string> <string name="aerr_process" msgid="4507058997035697579">"ដោយបរាជ័យ ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> បានបញ្ឈប់។"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> មិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវាឬ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"សកម្មភាព <xliff:g id="ACTIVITY">%1$s</xliff:g> មិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវា?"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index d51e93e1ce04..14c8855c5f45 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ಫಿಂಗರ್ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ರೀಡ್ ಮಾಡು"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ಸಿಂಕ್ ಆನ್ ಮತ್ತು ಸಿಂಕ್ ಆಫ್ ಟಾಗಲ್ ಮಾಡಿ"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ದುರದೃಷ್ಟವಶಾತ್, <xliff:g id="APPLICATION">%1$s</xliff:g> ಕೊನೆಗೊಂಡಿದೆ."</string> <string name="aerr_process" msgid="4507058997035697579">"ದುರದೃಷ್ಟವಶಾತ್, <xliff:g id="PROCESS">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು ಕೊನೆಗೊಂಡಿದೆ."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಅದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ಚಟುವಟಿಕೆಯು <xliff:g id="ACTIVITY">%1$s</xliff:g> ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಅದನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b510bd3b79ce..19a5dacfd60b 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>번째 손가락"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"지문 아이콘"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할지 여부를 확인할 수 있습니다."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"동기화 사용 및 사용 중지 전환"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g>(이)가 중지되었습니다."</string> <string name="aerr_process" msgid="4507058997035697579">"<xliff:g id="PROCESS">%1$s</xliff:g> 프로세스가 중지되었습니다."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>이(가) 응답하지 않습니다.\n\n닫으시겠습니까?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g>이(가) 응답하지 않습니다.\n\n닫으시겠습니까?"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index b6ea44e9bf66..1b6e428d2529 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -562,6 +562,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> манжасы"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <!-- no translation found for permlab_readSyncSettings (6201810008230503052) --> <skip /> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Колдонмого эсеп менен синхрондошуу тууралоолорун окуганга уруксат берет. Мисалы, Кишилер колдонмосу эсеп менен синхрондошкондугун аныктай алат."</string> @@ -1199,6 +1201,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Тилекке каршы, <xliff:g id="APPLICATION">%1$s</xliff:g> токтотулду."</string> <string name="aerr_process" msgid="4507058997035697579">"Тилекке каршы, <xliff:g id="PROCESS">%1$s</xliff:g> процесси токтотулду."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> жооп бербей жатат.\n\nЖабылсынбы?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> аракети жооп бербей жатат.\n\nЖабылсынбы?"</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index a5dbff51e551..3aee5de3eb23 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ນີ້ວມື <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ອ່ານການຕັ້ງຄ່າຊິ້ງຂໍ້ມູນ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງບັນຊີໄດ້. ຕົວຢ່າງເຊັ່ນ: ມັນຈະສາມາດກວດສອບໄດ້ແອັບຯ People ຖືກຊິ້ງຂໍ້ມູນກັບບັນຊີໃດນຶ່ງແລ້ວຫຼືຍັງ."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ສະລັບການເປີດ ແລະປິດການຊິ້ງຂໍ້ມູນ"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ຂໍອະໄພ, <xliff:g id="APPLICATION">%1$s</xliff:g> ຢຸດການເຮັດວຽກແລ້ວ."</string> <string name="aerr_process" msgid="4507058997035697579">"ຂໍອະໄພ, ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ໄດ້ຢຸດການເຮັດວຽກແລ້ວ."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ບໍ່ຕອບສະໜອງ. \n\nທ່ານຕ້ອງການປິດມັນບໍ່?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ການເຮັດວຽກ <xliff:g id="ACTIVITY">%1$s</xliff:g> ບໍ່ຕອບສະໜອງ. \n\n ທ່ານຕ້ອງການທີ່ຈະປິດມັນບໍ່?"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 73159fe1f6cc..70bdcb8f6dea 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Kontrolinio kodo piktograma"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leidžiama programai skaityti ir sinchronizuoti paskyros nustatymus. Pvz., taip gali būti nustatoma, ar su paskyra sinchronizuota Žmonių programa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"įjungti arba išjungti sinchronizavimą"</string> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Deja, <xliff:g id="APPLICATION">%1$s</xliff:g> sustojo."</string> <string name="aerr_process" msgid="4507058997035697579">"Deja, <xliff:g id="PROCESS">%1$s</xliff:g> sustojo."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"„<xliff:g id="APPLICATION">%2$s</xliff:g>“ neatsako.\n\nAr norite ją uždaryti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Veiksmas „<xliff:g id="ACTIVITY">%1$s</xliff:g>“ neatsako.\n\nAr norite jį uždaryti?"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index c58baafd66d5..1a3745f50792 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ļauj lietotnei lasīt konta sinhronizācijas iestatījumus. Piemēram, šādi var noteikt, vai lietotne Personas ir sinhronizēta ar kontu."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ieslēgt un izslēgt sinhronizāciju"</string> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Diemžēl lietojumprogrammas <xliff:g id="APPLICATION">%1$s</xliff:g> darbība ir apturēta."</string> <string name="aerr_process" msgid="4507058997035697579">"Diemžēl process <xliff:g id="PROCESS">%1$s</xliff:g> ir apturēts."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Lietojumprogramma <xliff:g id="APPLICATION">%2$s</xliff:g> nereaģē.\n\nVai vēlaties to aizvērt?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Darbība <xliff:g id="ACTIVITY">%1$s</xliff:g> nereaģē.\n\nVai vēlaties to aizvērt?"</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 127635c5c5e2..3408df7bda2f 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатоци"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"прочитај синхронизирани подесувања"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Овозможува апликацијата да ги чита подесувањата за синхронизирање на сметка. На пример, така може да се утврди дали апликацијата „Луѓе“ е синхронизирана со сметка."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вклучи и исклучи синхронизација"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"За жал, <xliff:g id="APPLICATION">%1$s</xliff:g> запре."</string> <string name="aerr_process" msgid="4507058997035697579">"За жал, процесот <xliff:g id="PROCESS">%1$s</xliff:g> запре."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> не реагира.\n\nДали сакате да ја затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Активноста <xliff:g id="ACTIVITY">%1$s</xliff:g> не реагира.\n\nДали сакате да ја затворите?"</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index fa597ccc7047..a615e3e1ca34 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"കൈവിരൽ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"വിരലടയാള ഐക്കൺ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ഒരു അക്കൗണ്ടിനായി സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ആളുകൾ അപ്ലിക്കേഷൻ ഒരു അക്കൗണ്ടിൽ സമന്വയിപ്പിച്ചിട്ടുണ്ടോയെന്നത് നിർണ്ണയിക്കാൻ ഇതിനാകും."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"സമന്വയം ഓണാക്കുക, ഓഫാക്കുക ടോഗിൾചെയ്യുക"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"നിർഭാഗ്യവശാൽ, <xliff:g id="APPLICATION">%1$s</xliff:g> പ്രവർത്തനം നിർത്തി."</string> <string name="aerr_process" msgid="4507058997035697579">"നിർഭാഗ്യവശാൽ, <xliff:g id="PROCESS">%1$s</xliff:g> എന്ന പ്രോസസ്സ് നിർത്തി."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>, പ്രതികരിക്കുന്നില്ല.\n\nനിങ്ങൾക്കത് അടയ്ക്കണോ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> പ്രവർത്തനം പ്രതികരിക്കുന്നില്ല.\n\nനിങ്ങൾക്കത് അടയ്ക്കണോ?"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 8bdacab13c3c..9aafcf1f32aa 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Хурууны хээ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Хурууны хээний дүрс"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"синк тохиргоог унших"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Апп нь акаунтын синк тохиргоог унших боломжтой. Жишээ нь энэ нь Хүмүүс апп акаунттай синк хийгдсэн эсэхийг тодорхойлох боломжтой."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синкийг унтрааж асаах тохиргоо"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Харамсалтай, <xliff:g id="APPLICATION">%1$s</xliff:g> зогссон."</string> <string name="aerr_process" msgid="4507058997035697579">"Харамсалтай нь <xliff:g id="PROCESS">%1$s</xliff:g> процесс зогссон."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> хариу өгөхгүй байна.\n\nТа хаамаар байна уу?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> активити хариу өгөхгүй байна.\n\nТа энийг хаах уу?"</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index bffd1962cc2f..4a130eef0301 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> बोट"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिंट चिन्ह"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"संकालन सेटिंग्ज वाचा"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"खात्याच्या संकालन सेटिंग्ज वाचण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, हे खात्यासह लोकांचा अॅप संकालित केला आहे किंवा नाही हे निर्धारित करू शकते."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"संकालन चालू आणि बंद करा टॉगल करा"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्दैवाने, <xliff:g id="APPLICATION">%1$s</xliff:g> थांबला."</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्दैवाने, प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> थांबली."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> प्रतिसाद देत नाही. \n\nआपण तो बंद करू इच्छिता?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> क्रियाकलाप प्रतिसाद देत नाही.\n\nआपण ती बंद करू इच्छिता?"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index b4cc8b54fd0e..b951ba2dc4b3 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"membaca tetapan penyegerakan"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Membenarkan apl membaca tetapan segerak untuk akaun. Sebagai contoh, ini boleh menentukan sama ada apl Orang disegerakkan dengan akaun."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"togol segerak hidup dan mati"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Malangnya, <xliff:g id="APPLICATION">%1$s</xliff:g> telah berhenti."</string> <string name="aerr_process" msgid="4507058997035697579">"Malangnya, proses <xliff:g id="PROCESS">%1$s</xliff:g> telah berhenti."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> tidak bertindak balas.\n\nAdakah anda mahu menutupnya?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviti <xliff:g id="ACTIVITY">%1$s</xliff:g> tidak bertindak balas. \n\n Adakah anda mahu menutupnya?"</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index e0ed55e5ec6e..46c2a457a994 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"လက်ဗွေ အိုင်ကွန်"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"အပလီကေးရှင်းအား အကောင့်တစ်ခုအတွက် ထပ်တူညီအောင် လုပ်ဆောင်မှု ဆက်တင်အား ကြည့်ခွင့် ပြုပါ။ ဥပမာ People app က အကောင့်တစ်ခုနဲ့ ထပ်တူညီအောင် လုပ်ရန် ဆက်သွယ်ထားမှု ရှိမရှိ သိရှိနိုင်ခြင်း"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ထပ်တူညီအောင် လုပ်ခြင်းအား ပြုနိုင်၊ မပြုနိုင် အပြောင်းအလဲလုပ်ခြင်း"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ဝမ်းနည်းစွာဖြင့်<xliff:g id="APPLICATION">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string> <string name="aerr_process" msgid="4507058997035697579">"ဝမ်းနည်းစွာဖြင့် လုပ်ဆောင်ချက်<xliff:g id="PROCESS">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> က မတုံ့ပြန်ပါ။ \n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"လှုပ်ရှားမှု <xliff:g id="ACTIVITY">%1$s</xliff:g>က မတုံ့ပြန်ပါ။\n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 6caf26dc9643..67b9385f85dc 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lar appen lese synkroniseringsinnstillingene for en konto. For eksempel kan den finne ut om Personer-appen er synkronisert med en konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering av og på"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> har dessverre stoppet."</string> <string name="aerr_process" msgid="4507058997035697579">"Prosessen <xliff:g id="PROCESS">%1$s</xliff:g> har dessverre stoppet."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarer ikke.\n\nVil du lukke appen?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarer ikke.\n\nVil du lukke den?"</string> @@ -950,7 +954,7 @@ <string name="ringtone_default" msgid="3789758980357696936">"Standard ringetone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standard ringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> <string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string> - <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringetoner"</string> + <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringelyder"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ukjent ringetone"</string> <plurals name="wifi_available" formatted="false" msgid="7900333017752027322"> <item quantity="other">Wi-Fi-nettverk er tilgjengelig</item> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 942a9879c0ec..496d4254ecaf 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"औंला <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिन्ट आइकन"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढ्नुहोस्"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"अनुप्रयोगलाई खाताको लागि सिङ्क सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको अनुप्रयोग खातासँग सिङ्क भएको नभएको निर्धारण गर्न सक्दछ।"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"टगल सिङ्क खुला र बन्द"</string> @@ -902,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"दुर्भाग्यवश, <xliff:g id="APPLICATION">%1$s</xliff:g> रोकिएको छ।"</string> <string name="aerr_process" msgid="4507058997035697579">"दुर्भाग्यवश, प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> बन्द भयो।"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>ले कार्य गरिरहेको छैन।\n\nके तपाईँ यसलाई बन्द गर्न चाहनु हुन्छ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> ले प्रतिक्रिया देखाइरहेको छैन।\n\nके तपाईं यसलाई बन्द गर्न चाहनु हुन्छ?"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 8e4bd6dbce0d..e9c9ba2d87ab 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"synchronisatie-instellingen lezen"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"synchronisatie in- en uitschakelen"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> is gestopt."</string> <string name="aerr_process" msgid="4507058997035697579">"Het proces <xliff:g id="PROCESS">%1$s</xliff:g> is gestopt."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> reageert niet.\n\nWilt u deze app sluiten?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> reageert niet.\n\nWilt u deze activiteit sluiten?"</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 94c7a28426f6..faafe8599878 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਆਈਕਨ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਨਿਰਧਾਰਿਤ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਨਾਲ ਸਿੰਕ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ਸਿੰਕ ਟੌਗਲ ਚਾਲੂ ਅਤੇ ਬੰਦ"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ਅਫ਼਼ਸੋਸ ਨਾਲ, <xliff:g id="APPLICATION">%1$s</xliff:g> ਰੁਕ ਗਈ ਹੈ।"</string> <string name="aerr_process" msgid="4507058997035697579">"ਅਫ਼਼ਸੋਸ ਨਾਲ, ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%1$s</xliff:g> ਰੁਕ ਗਈ ਹੈ।"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"ਗਤੀਵਿਧੀ <xliff:g id="ACTIVITY">%1$s</xliff:g> ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d17c1fa80936..070ba9d1c504 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Palec <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odcisku palca"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"czytanie ustawień synchronizacji"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Zezwala aplikacji na odczyt ustawień synchronizacji konta. Pozwala to na przykład określić, czy aplikacja Ludzie jest zsynchronizowana z kontem."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"włączanie i wyłączanie synchronizacji"</string> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Niestety, aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> została zatrzymana."</string> <string name="aerr_process" msgid="4507058997035697579">"Niestety, proces <xliff:g id="PROCESS">%1$s</xliff:g> został zatrzymany."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacja <xliff:g id="APPLICATION">%2$s</xliff:g> nie reaguje.\n\nCzy chcesz ją zamknąć?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Działanie <xliff:g id="ACTIVITY">%1$s</xliff:g> nie odpowiada.\n\nCzy chcesz je zakończyć?"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 1b517a3d878a..41dd5e2a8dac 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"O <xliff:g id="APPLICATION">%1$s</xliff:g> parou."</string> <string name="aerr_process" msgid="4507058997035697579">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está respondendo.\n\nDeseja fechá-lo?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 1390f4c3c69b..ff741f62c25c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler definições de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que a aplicação leia as definições de sincronização de uma conta. Por exemplo, pode determinar se a aplicação Pessoas está sincronizada com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar a sincronização"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Lamentamos, o <xliff:g id="APPLICATION">%1$s</xliff:g> foi interrompido."</string> <string name="aerr_process" msgid="4507058997035697579">"Lamentamos, o processo <xliff:g id="PROCESS">%1$s</xliff:g> foi interrompido."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está a responder. \n\nPretende fechá-la?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está a responder. \n\n Pretende fechá-la?"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 1b517a3d878a..41dd5e2a8dac 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"O <xliff:g id="APPLICATION">%1$s</xliff:g> parou."</string> <string name="aerr_process" msgid="4507058997035697579">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está respondendo.\n\nDeseja fechá-lo?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index b147a283a4b6..1da95b323797 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -181,10 +181,10 @@ <string name="power_dialog" product="tv" msgid="6153888706430556356">"Opțiuni TV"</string> <string name="power_dialog" product="default" msgid="1319919075463988638">"Opţiuni telefon"</string> <string name="silent_mode" msgid="7167703389802618663">"Mod Silenţios"</string> - <string name="turn_on_radio" msgid="3912793092339962371">"Activaţi funcţia wireless"</string> + <string name="turn_on_radio" msgid="3912793092339962371">"Activați funcţia wireless"</string> <string name="turn_off_radio" msgid="8198784949987062346">"Dezactivaţi funcţia wireless"</string> - <string name="screen_lock" msgid="799094655496098153">"Blocaţi ecranul"</string> - <string name="power_off" msgid="4266614107412865048">"Opriţi alimentarea"</string> + <string name="screen_lock" msgid="799094655496098153">"Blocați ecranul"</string> + <string name="power_off" msgid="4266614107412865048">"Opriți alimentarea"</string> <string name="silent_mode_silent" msgid="319298163018473078">"Sonerie dezactivată"</string> <string name="silent_mode_vibrate" msgid="7072043388581551395">"Vibrare sonerie"</string> <string name="silent_mode_ring" msgid="8592241816194074353">"Sonerie activată"</string> @@ -207,8 +207,8 @@ <string name="global_actions" product="tablet" msgid="408477140088053665">"Opţiuni tablet PC"</string> <string name="global_actions" product="tv" msgid="7240386462508182976">"Opțiuni TV"</string> <string name="global_actions" product="default" msgid="2406416831541615258">"Opţiuni telefon"</string> - <string name="global_action_lock" msgid="2844945191792119712">"Blocaţi ecranul"</string> - <string name="global_action_power_off" msgid="4471879440839879722">"Opriţi alimentarea"</string> + <string name="global_action_lock" msgid="2844945191792119712">"Blocați ecranul"</string> + <string name="global_action_power_off" msgid="4471879440839879722">"Opriți alimentarea"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string> <string name="bugreport_title" msgid="2667494803742548533">"Executaţi un raport despre erori"</string> <string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informaţii despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string> @@ -228,21 +228,21 @@ <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> <string name="managed_profile_label" msgid="6260850669674791528">"Serviciu"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Persoane de contact"</string> - <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accesează persoanele de contact"</string> + <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceseze persoanele de contact"</string> <string name="permgrouplab_location" msgid="7275582855722310164">"Locație"</string> - <string name="permgroupdesc_location" msgid="1346617465127855033">"accesează locația acestui dispozitiv"</string> + <string name="permgroupdesc_location" msgid="1346617465127855033">"acceseze locația acestui dispozitiv"</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string> <string name="permgroupdesc_calendar" msgid="3889615280211184106">"accesează calendarul"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> <string name="permgroupdesc_sms" msgid="4656988620100940350">"trimite și vede mesajele SMS"</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"Stocare"</string> - <string name="permgroupdesc_storage" msgid="637758554581589203">"accesează fotografiile, conținutul media și fișierele de pe dispozitiv"</string> + <string name="permgroupdesc_storage" msgid="637758554581589203">"acceseze fotografiile, conținutul media și fișierele de pe dispozitiv"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Microfonul"</string> - <string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistrează conținut audio"</string> + <string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistreze conținut audio"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Camera foto"</string> - <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografiază și înregistrează videoclipuri"</string> + <string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografieze și să înregistreze videoclipuri"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string> - <string name="permgroupdesc_phone" msgid="6234224354060641055">"inițiază și gestionează apeluri telefonice"</string> + <string name="permgroupdesc_phone" msgid="6234224354060641055">"inițieze și să gestioneze apeluri telefonice"</string> <string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori corporali"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accesează datele înregistrate de senzori despre semnele vitale"</string> <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperează conținutul ferestrei"</string> @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activează/dezactivează sincronizarea"</string> @@ -495,19 +497,19 @@ <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string> <string name="permlab_access_notification_policy" msgid="4247510821662059671">"accesează Nu deranja"</string> <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Permite aplicației să citească și să scrie configurația Nu deranja."</string> - <string name="policylab_limitPassword" msgid="4497420728857585791">"Setaţi reguli pentru parolă"</string> + <string name="policylab_limitPassword" msgid="4497420728857585791">"Setați reguli pentru parolă"</string> <string name="policydesc_limitPassword" msgid="2502021457917874968">"Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string> - <string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizaţi încercările de deblocare a ecranului"</string> + <string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizați încercările de deblocare a ecranului"</string> <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului și blocaţi tableta sau ştergeţi datele acesteia dacă sunt introduse prea multe parole incorecte."</string> <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați televizorul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> - <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului și blocaţi telefonul sau ştergeţi toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați tableta sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați televizorul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Monitorizați numărul de parole incorecte introduse la deblocarea ecranului și blocați telefonul sau ștergeți toate datele acestui utilizator dacă se introduc prea multe parole incorecte."</string> <string name="policylab_resetPassword" msgid="4934707632423915395">"Schimbarea setărilor de blocare a ecranului"</string> <string name="policydesc_resetPassword" msgid="1278323891710619128">"Modificați blocarea ecranului."</string> - <string name="policylab_forceLock" msgid="2274085384704248431">"Blocaţi ecranul"</string> - <string name="policydesc_forceLock" msgid="1141797588403827138">"Stabiliţi modul și timpul în care se blochează ecranul."</string> + <string name="policylab_forceLock" msgid="2274085384704248431">"Blocați ecranul"</string> + <string name="policydesc_forceLock" msgid="1141797588403827138">"Stabiliți modul și timpul în care se blochează ecranul."</string> <string name="policylab_wipeData" msgid="3910545446758639713">"Ștergere integrală date"</string> <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Ștergeţi datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică."</string> <string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Ștergeți datele de pe televizor fără avertisment, prin revenirea la setările din fabrică."</string> @@ -516,14 +518,14 @@ <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Ștergeți datele acestui utilizator de pe această tabletă fără avertisment."</string> <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Ștergeți datele acestui utilizator de pe acest televizor fără avertisment."</string> <string name="policydesc_wipeData_secondaryUser" product="default" msgid="6787904546711590238">"Ștergeți datele acestui utilizator de pe acest telefon fără avertisment."</string> - <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setaţi serverul proxy global pentru dispozitiv"</string> + <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setați serverul proxy global pentru dispozitiv"</string> <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Setați serverul proxy global pentru dispozitiv, care să fie utilizat cât timp politica este activă. Numai proprietarul dispozitivului poate seta serverul proxy global."</string> <string name="policylab_expirePassword" msgid="5610055012328825874">"Setați expirarea parolei pentru blocarea ecranului"</string> <string name="policydesc_expirePassword" msgid="5367525762204416046">"Modificați frecvența cu care trebuie să se schimbe parola, codul PIN sau modelul pentru blocarea ecranului."</string> - <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Setaţi criptarea stocării"</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Setați criptarea stocării"</string> <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Necesită ca datele aplicației stocate să fie criptate."</string> - <string name="policylab_disableCamera" msgid="6395301023152297826">"Dezactivaţi camerele foto"</string> - <string name="policydesc_disableCamera" msgid="2306349042834754597">"Împiedicaţi utilizarea camerelor foto de pe dispozitiv."</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"Dezactivați camerele foto"</string> + <string name="policydesc_disableCamera" msgid="2306349042834754597">"Împiedicați utilizarea camerelor foto de pe dispozitiv."</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Opriți funcții de blocare ecran"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Împiedicați folosirea unor funcții de blocare a ecranului."</string> <string-array name="phoneTypes"> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Din păcate, <xliff:g id="APPLICATION">%1$s</xliff:g> s-a oprit."</string> <string name="aerr_process" msgid="4507058997035697579">"Din păcate, procesul <xliff:g id="PROCESS">%1$s</xliff:g> s-a oprit."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplicaţia <xliff:g id="APPLICATION">%2$s</xliff:g> nu răspunde.\n\nDoriţi să o închideţi?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Activitatea <xliff:g id="ACTIVITY">%1$s</xliff:g> nu răspunde.\n\nDoriţi să o închideţi?"</string> @@ -932,7 +936,7 @@ <string name="old_app_action" msgid="493129172238566282">"Reveniţi la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> <string name="old_app_description" msgid="2082094275580358049">"Nu porniţi aplicația nouă."</string> <string name="new_app_action" msgid="5472756926945440706">"Porniţi <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Opriţi vechea aplicație fără să salvaţi."</string> + <string name="new_app_description" msgid="1932143598371537340">"Opriți vechea aplicație fără să salvaţi."</string> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string> <string name="dump_heap_notification_detail" msgid="2075673362317481664">"Datele privind memoria au fost culese; atingeți pentru a trimite"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string> @@ -1236,7 +1240,7 @@ <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Se trimite..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string> - <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptaţi apelul?"</string> + <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Numai o dată"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nu acceptă profilul de serviciu"</string> @@ -1276,7 +1280,7 @@ <string name="kg_password_instructions" msgid="5753646556186936819">"Introduceţi parola"</string> <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"Cardul SIM este acum dezactivat. Introduceţi codul PUK pentru a continua. Contactaţi operatorul pentru mai multe detalii."</string> <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduceţi codul PIN dorit"</string> - <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmaţi codul PIN dorit"</string> + <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmați codul PIN dorit"</string> <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Se deblochează cardul SIM..."</string> <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Cod PIN incorect."</string> <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduceţi un cod PIN format din 4 până la 8 cifre."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index b82d93f703b1..7d2dd4ee3b55 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -436,6 +436,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Просмотр настроек синхронизации"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Приложение сможет просматривать настройки синхронизации аккаунта, например определять, включена ли синхронизация для приложения \"Контакты\"."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Включение/выключение синхронизации"</string> @@ -906,6 +908,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"В приложении \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" произошла ошибка."</string> <string name="aerr_process" msgid="4507058997035697579">"В приложении \"<xliff:g id="PROCESS">%1$s</xliff:g>\" произошла ошибка."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Приложение \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" не отвечает.\n\nЗакрыть его?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Приложение \"<xliff:g id="ACTIVITY">%1$s</xliff:g>\" не отвечает.\n\nЗакрыть его?"</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 3039925eb773..762b8e95c6c9 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"ඇඟිලි <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත සැකසීම් කියවන්න"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ගිණුම සඳහා සමමුහුර්ත සැකසීම් කියවීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දැයි මෙයට හඳුනා ගත හැක."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"සමමුහුර්ත කිරීම සක්රිය කරන්න සහ අක්රිය කරන්න"</string> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"අවාසනාවන්ත ලෙස <xliff:g id="APPLICATION">%1$s</xliff:g> නැවතී ඇත."</string> <string name="aerr_process" msgid="4507058997035697579">"අවාසනාවන්ත ලෙස, <xliff:g id="PROCESS">%1$s</xliff:g> ක්රියාවලිය නතර විණි."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ප්රතිචාර නොදක්වයි.\n\nඔබට එය නතර කිරීමට අවශ්යද?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ක්රියාකාරකම ප්රතිචාර නොදක්වයි.\n\nඑය වසා දැමීමට ඔබට අවශ්යද?"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index fd3a640ffd01..0d482e116b64 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odtlačku prsta"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítať nastavenia synchronizácie"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikácii čítať nastavenia synchronizácie v účte. Môže napríklad určiť, či je s účtom synchronizovaná aplikácia Ľudia."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"zapnúť alebo vypnúť synchronizáciu"</string> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> bohužiaľ prestala pracovať."</string> <string name="aerr_process" msgid="4507058997035697579">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> bohužiaľ prestal pracovať."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikácia <xliff:g id="APPLICATION">%2$s</xliff:g> neodpovedá.\n\nChcete ju zavrieť?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktivita <xliff:g id="ACTIVITY">%1$s</xliff:g> neodpovedá.\n\nChcete ju zavrieť?"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 017f96e2523c..bb143295ae18 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona prstnih odtisov"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogoča branje nastavitev sinhronizacije za račun. S tem lahko aplikacija na primer ugotovi, ali je aplikacija Ljudje sinhronizirana z računom."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vklop in izklop sinhronizacije"</string> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Žal se je aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> ustavila."</string> <string name="aerr_process" msgid="4507058997035697579">"Žal se je postopek <xliff:g id="PROCESS">%1$s</xliff:g> ustavil."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacija <xliff:g id="APPLICATION">%2$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Dejavnost <xliff:g id="ACTIVITY">%1$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 89f5e5ed5b4d..d5c4e82de612 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Gishti <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona e gjurmës së gishtit"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lexo cilësimet e sinkronizimit"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lejon aplikacionin të lexojë cilësimet e sinkronizimit për një llogari. Për shembull, kjo mund të përcaktojë nëse aplikacioni \"Kontaktet\" është i sinkronizuar me një llogari."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ndiz ose fik sinkronizimin"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Fatkeqësisht, <xliff:g id="APPLICATION">%1$s</xliff:g> ka ndaluar."</string> <string name="aerr_process" msgid="4507058997035697579">"Fatkeqësisht, procesi <xliff:g id="PROCESS">%1$s</xliff:g> ka ndaluar."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> nuk po përgjigjet.\n\nDëshiron ta mbyllësh?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteti <xliff:g id="ACTIVITY">%1$s</xliff:g> nuk përgjigjet.\n\nDëshiron ta mbyllësh?"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index feb7eedcb7e4..a29faa3d88da 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -435,6 +435,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозвољава апликацији да чита подешавања синхронизације за налог. На пример, овако може да се утврди да ли је апликација Људи синхронизована са налогом."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"укључивање и искључивање синхронизације"</string> @@ -901,6 +903,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Нажалост, апликација <xliff:g id="APPLICATION">%1$s</xliff:g> је престала с радом."</string> <string name="aerr_process" msgid="4507058997035697579">"Нажалост, процес <xliff:g id="PROCESS">%1$s</xliff:g> је заустављен."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> не реагује.\n\nДа ли желите да је затворите?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Активност <xliff:g id="ACTIVITY">%1$s</xliff:g> не рeагује.\n\nДа ли желите да је затворите?"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 3673e35d5636..4986d8241deb 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon för fingeravtryck"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"läsa synkroniseringsinställningar"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillåter att appen läser synkroniseringsinställningarna för ett konto. Detta kan användas till exempel för att avgöra om appen Personer är synkroniserad med ett konto."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"aktivera/inaktivera synkronisering"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> har tyvärr stoppats."</string> <string name="aerr_process" msgid="4507058997035697579">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> har tyvärr stoppats."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> svarar inte.\n\nVill du stänga den?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> svarar inte.\n \nVill du stänga den?"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index f92b385273a1..0ce1e537e392 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Kitambulisho <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Aikoni ya kitambulisho"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"kusoma mipangilio ya usawazishaji"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Inaruhusu programu kusoma mipangilio ya upatanishi wa akaunti. Kwa mfano, huku kunaweza kuamua kama programu ya Watu imepatanishwa na akaunti."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kuwasha na kuzima usawazishaji"</string> @@ -898,6 +899,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Kwa bahati mbaya, <xliff:g id="APPLICATION">%1$s</xliff:g> imeacha kufanya kazi."</string> <string name="aerr_process" msgid="4507058997035697579">"Kwa bahati mbaya, mchakato wa <xliff:g id="PROCESS">%1$s</xliff:g> umekoma."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> haifanyi kazi.\n\nUnataka kuifunga?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Shughuli ya <xliff:g id="ACTIVITY">%1$s</xliff:g> haifanyi kazi.\n\nJe, ungependa kuifunga?"</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index f92393c01868..c548188f996e 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"கைரேகை ஐகான்"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் பயன்பாடு கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ஒத்திசைவை இயக்குவதையும், முடக்குவதையும் மாற்றுதல்"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"துரதிருஷ்டவசமாக, <xliff:g id="APPLICATION">%1$s</xliff:g> நிறுத்தப்பட்டது."</string> <string name="aerr_process" msgid="4507058997035697579">"துரதிருஷ்டவசமாக, <xliff:g id="PROCESS">%1$s</xliff:g> செயல்முறை நிறுத்தப்பட்டது."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> பதிலளிக்கவில்லை.\n\nஇதை மூட விருப்பமா?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> செயல்பாடு பதிலளிக்கவில்லை.\n\nஇதை மூடவா?"</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 5df96d4fd186..8dd6070a2555 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"వేలిముద్ర చిహ్నం"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"సమకాలీకరణ సెట్టింగ్లను చదవడం"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ఖాతా యొక్క సమకాలీకరణ సెట్టింగ్లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఉదాహరణకు, వ్యక్తుల అనువర్తనం ఖాతాతో సమకాలీకరించబడాలా లేదా అనే విషయాన్ని ఇది నిశ్చయించవచ్చు."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"సమకాలీకరణను ఆన్ మరియు ఆఫ్కు టోగుల్ చేయడం"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"దురదృష్టవశాత్తూ, <xliff:g id="APPLICATION">%1$s</xliff:g> ఆపివేయబడింది."</string> <string name="aerr_process" msgid="4507058997035697579">"దురదృష్టవశాత్తూ, ప్రక్రియ <xliff:g id="PROCESS">%1$s</xliff:g> ఆపివేయబడింది."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ప్రతిస్పందించలేదు.\n\nమీరు దీన్ని మూసివేయాలనుకుంటున్నారా?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> కార్యాచరణ ప్రతిస్పందించలేదు.\n\nమీరు దీన్ని మూసివేయాలనుకుంటున్నారా?"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index dc8936a979e0..8e51472261b7 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"นิ้ว <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ไอคอนลายนิ้วมือ"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าการซิงค์ของบัญชี ตัวอย่างเช่น การอนุญาตนี้สามารถระบุได้ว่าแอปพลิเคชัน People ซิงค์กับบัญชีหรือไม่"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"สลับระหว่างเปิดและปิดการซิงค์"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"ขออภัย <xliff:g id="APPLICATION">%1$s</xliff:g> หยุดการทำงานแล้ว"</string> <string name="aerr_process" msgid="4507058997035697579">"ขออภัย กระบวนการ <xliff:g id="PROCESS">%1$s</xliff:g> หยุดการทำงานแล้ว"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ไม่ตอบสนอง\n\nคุณต้องการปิดหรือไม่"</string> <string name="anr_activity_process" msgid="5776209883299089767">"กิจกรรม <xliff:g id="ACTIVITY">%1$s</xliff:g> ไม่ตอบสนอง\n\nคุณต้องการปิดหรือไม่"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index c8e452af68e5..3a5f7d7277f2 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icon ng fingerprint"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Pinapayagan ang app na basahin ang mga setting ng pag-sync para sa isang account. Halimbawa, matutukoy nito kung naka-sync ang app na Mga Tao sa isang account."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"I-toggle on at off ang pag-sync"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Sa kasamaang palad, huminto ang <xliff:g id="APPLICATION">%1$s</xliff:g>."</string> <string name="aerr_process" msgid="4507058997035697579">"Sa kasamaang palad, nahinto ang prosesong <xliff:g id="PROCESS">%1$s</xliff:g>."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Hindi tumutugon ang <xliff:g id="APPLICATION">%2$s</xliff:g>.\n\nNais mo ba itong isara?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Hindi tumutugon ang aktibidad na <xliff:g id="ACTIVITY">%1$s</xliff:g>.\n\nNais mo ba itong isara?"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 30107cbbf2a4..eaf0d3e35e97 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını okuma"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını okuma izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize olup olmadığını belirleyebilir."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"senkronizasyonu açma/kapatma"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Maalesef <xliff:g id="APPLICATION">%1$s</xliff:g> durdu."</string> <string name="aerr_process" msgid="4507058997035697579">"Maalesef <xliff:g id="PROCESS">%1$s</xliff:g> işlemi durdu."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> yanıt vermiyor.\n\nKapatmak ister misiniz?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> yanıt vermiyor.\n\nKapatmak ister misiniz?"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 8ce102b82938..70c366b4d560 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -436,6 +436,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Відбиток пальця <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок відбитка пальця"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читати налаштування синхронізації"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозволяє програмі читати налаштування синхронізації для облікового запису, наприклад, визначати, чи програма Люди синхронізується з обліковим записом."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вмикати й вимикати синхронізацію"</string> @@ -906,6 +907,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"На жаль, програма <xliff:g id="APPLICATION">%1$s</xliff:g> припинила роботу."</string> <string name="aerr_process" msgid="4507058997035697579">"На жаль, програма <xliff:g id="PROCESS">%1$s</xliff:g> припинила роботу."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"Програма <xliff:g id="APPLICATION">%2$s</xliff:g> не відповідає.\n\nЗакрити її?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Дія <xliff:g id="ACTIVITY">%1$s</xliff:g> не відповідає.\n\nЗакінчити її?"</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index a1a08e383908..68b49f581dba 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"مطابقت پذیری کی ترتیبات پڑھیں"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کی ترتیبات پڑھنے کی اجازت دیتا ہے۔ مثلا، یہ تعین کرسکتا ہے کہ آیا People ایپ کسی اکاؤنٹ کے ساتھ مطابقت پذیر ہے۔"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"مطابقت پذیری آن اور آف ٹوگل کریں"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"بدقسمتی سے، <xliff:g id="APPLICATION">%1$s</xliff:g> بند ہو گیا۔"</string> <string name="aerr_process" msgid="4507058997035697579">"بدقسمتی سے، کارروائی <xliff:g id="PROCESS">%1$s</xliff:g> بند ہو گئی۔"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> جواب نہیں دے رہی ہے۔ \n\nکیا آپ اسے بند کرنا چاہتے ہیں؟"</string> <string name="anr_activity_process" msgid="5776209883299089767">"سرگرمی <xliff:g id="ACTIVITY">%1$s</xliff:g> جواب نہیں دے رہی ہے۔ \n\nکیا آپ اسے بند کرنا چاہتے ہیں؟"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index dab2876d8a74..4d5573f32702 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -130,7 +130,7 @@ </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> - <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chirilgan"</string> + <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chiq"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzal ko‘rilsin"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobil tarmoq afzal ko‘rilsin"</string> <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Faqat Wi-Fi"</string> @@ -434,6 +434,8 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Barmoq izi <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) --> + <skip /> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx-sh sozlamalarini o‘qish"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ilovaga hisobning sinxronlash sozlamalarini o‘qish uchun ruxsat beradi. Masalan, bu \"Odamlar\" ilovasi hisob bilan sinxronlangan yoki aksini aniqlay oladi."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinx.ni yoqish/o‘chirish"</string> @@ -673,8 +675,8 @@ <string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"To‘xtatib turish"</string> <string name="lockscreen_transport_play_description" msgid="1901258823643886401">"Ijro qilish"</string> <string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"To‘xtatish"</string> - <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Tezkor orqaga qaytarish"</string> - <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Tezkor oldinga o‘tkazish"</string> + <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Orqaga o‘tkazish"</string> + <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Oldinga o‘tkazish"</string> <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda chaqiruvlar"</string> <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Tarmoq qulflangan"</string> <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-karta PUK kod bilan qulflangan."</string> @@ -813,7 +815,7 @@ </plurals> <string name="last_month" msgid="3959346739979055432">"O‘tgan oy"</string> <string name="older" msgid="5211975022815554840">"Eskiroq"</string> - <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>da"</string> + <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string> <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>da"</string> <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g>da"</string> <string name="day" msgid="8144195776058119424">"kun"</string> @@ -875,8 +877,8 @@ <string name="no" msgid="5141531044935541497">"Bekor qilish"</string> <string name="dialog_alert_title" msgid="2049658708609043103">"Diqqat"</string> <string name="loading" msgid="7933681260296021180">"Yuklanmoqda…"</string> - <string name="capital_on" msgid="1544682755514494298">"YONIQ"</string> - <string name="capital_off" msgid="6815870386972805832">"O‘CHIQ"</string> + <string name="capital_on" msgid="1544682755514494298">"I"</string> + <string name="capital_off" msgid="6815870386972805832">"O"</string> <string name="whichApplication" msgid="4533185947064773386">"Ushbudan foydalanib amalni tugatish:"</string> <string name="whichApplicationNamed" msgid="8260158865936942783">"“%1$s” ilovasi yordamida bajarish"</string> <string name="whichViewApplication" msgid="3272778576700572102">"Ochish…"</string> @@ -896,6 +898,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Baxtga qarshi, <xliff:g id="APPLICATION">%1$s</xliff:g> to‘xtatildi."</string> <string name="aerr_process" msgid="4507058997035697579">"Baxtga qarshi, <xliff:g id="PROCESS">%1$s</xliff:g> jarayoni to‘xtatildi."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> javob bermayapti.\n\nUni yopishni xohlaysizmi?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> harakati javob bermayapti.\n\nUni yopishni xohlaysizmi?"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 11d05de1909c..062b2104ac61 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Biểu tượng vân tay"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hóa"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Cho phép ứng dụng đọc cài đặt đồng bộ hóa cho tài khoản. Ví dụ: việc này có thể xác định liệu ứng dụng Mọi người đã được đồng bộ hóa với tài khoản chưa."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"chuyển đổi bật và tắt đồng bộ hóa"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Rất tiếc, <xliff:g id="APPLICATION">%1$s</xliff:g> đã dừng lại."</string> <string name="aerr_process" msgid="4507058997035697579">"Rất tiếc, quá trình <xliff:g id="PROCESS">%1$s</xliff:g> đã dừng lại."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> hiện không phản hồi.\n\nBạn có muốn đóng ứng dụng này không?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Hoạt động <xliff:g id="ACTIVITY">%1$s</xliff:g> không phản hồi.\n\nBạn có muốn đóng ứng dụng này không?"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 36eadaee44ad..72a77364c071 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指纹图标"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允许该应用读取某个帐户的同步设置。例如,此权限可确定“联系人”应用是否与某个帐户同步。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"启用和停用同步"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"很抱歉,“<xliff:g id="APPLICATION">%1$s</xliff:g>”已停止运行。"</string> <string name="aerr_process" msgid="4507058997035697579">"抱歉,进程“<xliff:g id="PROCESS">%1$s</xliff:g>”已停止运行。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g>无响应。\n\n要将其关闭吗?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动无响应。\n\n要将其关闭吗?"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index eaeb36dce29e..f3665486f6b8 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步設定,例如確定「通訊錄」應用程式是否和某個帳戶保持同步。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟和關閉同步功能"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"抱歉,<xliff:g id="APPLICATION">%1$s</xliff:g>已停止操作。"</string> <string name="aerr_process" msgid="4507058997035697579">"很抱歉,處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已停止。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"活動 <xliff:g id="ACTIVITY">%1$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 34bde57123fd..e296fa5f16c8 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步處理設定,例如判斷「使用者」應用程式是否和某個帳戶進行同步處理。"</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟及關閉同步功能"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"很抱歉,<xliff:g id="APPLICATION">%1$s</xliff:g>已停止運作。"</string> <string name="aerr_process" msgid="4507058997035697579">"很抱歉,處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已停止。"</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> 沒有回應。\n\n您要結束嗎?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> 活動沒有回應。\n\n您要結束嗎?"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index f9eaea46186c..e5ef6950f9db 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -434,6 +434,7 @@ <string name="fingerprint_name_template" msgid="5870957565512716938">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Isithonjana sezigxivizo zeminwe"</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"funda izilungiselelo zokuvumelanisa"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo zokuvumelanisa ze-akhawunti. Isibonelo, lokhu kungacacisa ukuthi noma ngabe uhlelo lokusebenza le-People livumelanisiwe ne-akhawunti."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"shintsha phakathi kokuvula kanye nokucisha ukuvumelanisa"</string> @@ -896,6 +897,8 @@ <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"Ngeshwa, <xliff:g id="APPLICATION">%1$s</xliff:g> kumile."</string> <string name="aerr_process" msgid="4507058997035697579">"Ngeshwa, uhlelo <xliff:g id="PROCESS">%1$s</xliff:g> luvele lwama."</string> + <!-- no translation found for aerr_process_silence (4226685530196000222) --> + <skip /> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> ayiphenduli.\n\nIngabe ufuna ukuyivala?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"Uhlelo <xliff:g id="ACTIVITY">%1$s</xliff:g> aluphenduli.\n\nIngabe ufuna ukuluvala?"</string> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index f2879398471a..3c838b2aa96d 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2653,6 +2653,8 @@ <public type="id" name="accessibilityActionScrollRight" id="0x0102003b" /> <public type="id" name="accessibilityActionContextClick" id="0x0102003c" /> + <public type="string" name="fingerprint_icon_content_description" /> + <!-- =============================================================== Resources added in version N of the platform =============================================================== --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 104a5bb34e6b..198cc1af2b67 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1221,6 +1221,9 @@ <string-array name="fingerprint_error_vendor"> </string-array> + <!-- Content description which should be used for the fingerprint icon. --> + <string name="fingerprint_icon_content_description">Fingerprint icon</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_readSyncSettings">read sync settings</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> @@ -2552,6 +2555,9 @@ <!-- Text of the alert that is displayed when an application has crashed. --> <string name="aerr_process">Unfortunately, the process <xliff:g id="process">%1$s</xliff:g> has stopped.</string> + <!-- Text of the alert that is displayed when an application has crashed. --> + <string name="aerr_process_silence">Silence crashes from <xliff:g id="process">%1$s</xliff:g> + until reboot.</string> <!-- Title of the alert when an application is not responding. --> <string name="anr_title"></string> <!-- Text of the alert that is displayed when an application is not responding. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 4e9488ac0b82..091868b34e40 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1714,6 +1714,7 @@ <java-symbol type="layout" name="launch_warning" /> <java-symbol type="layout" name="safe_mode" /> <java-symbol type="layout" name="simple_list_item_2_single_choice" /> + <java-symbol type="layout" name="app_error_dialog_dont_show_again" /> <java-symbol type="plurals" name="wifi_available" /> <java-symbol type="plurals" name="wifi_available_detailed" /> <java-symbol type="string" name="accessibility_binding_label" /> @@ -1721,6 +1722,7 @@ <java-symbol type="string" name="adb_active_notification_title" /> <java-symbol type="string" name="aerr_application" /> <java-symbol type="string" name="aerr_process" /> + <java-symbol type="string" name="aerr_process_silence" /> <java-symbol type="string" name="aerr_title" /> <java-symbol type="string" name="android_upgrading_fstrim" /> <java-symbol type="string" name="android_upgrading_apk" /> diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index 79a0b0c6cf38..7cd25afe5bcd 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -23,7 +23,16 @@ LOCAL_SRC_FILES := \ LOCAL_DX_FLAGS := --core-library LOCAL_AAPT_FLAGS = -0 dat -0 gld -LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support android-common frameworks-core-util-lib mockwebserver guava littlemock mockito-target +LOCAL_STATIC_JAVA_LIBRARIES := \ + core-tests-support \ + android-common \ + frameworks-core-util-lib \ + mockwebserver \ + guava \ + littlemock \ + android-support-test \ + mockito-target \ + espresso-core LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common org.apache.http.legacy LOCAL_PACKAGE_NAME := FrameworksCoreTests diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 263ea6200a5a..3afc3dfa3b11 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -136,6 +136,13 @@ </intent-filter> </activity> + <activity android:name="android.widget.TextViewActivity" android:label="TextViewActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" /> + </intent-filter> + </activity> + <activity android:name="android.widget.focus.DescendantFocusability" android:label="DescendantFocusability"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -1269,7 +1276,7 @@ </application> - <instrumentation android:name="android.test.InstrumentationTestRunner" + <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" android:targetPackage="com.android.frameworks.coretests" android:label="Frameworks Core Tests" /> <key-sets> diff --git a/core/tests/coretests/res/layout/activity_text_view.xml b/core/tests/coretests/res/layout/activity_text_view.xml new file mode 100644 index 000000000000..7ab0b130c293 --- /dev/null +++ b/core/tests/coretests/res/layout/activity_text_view.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2015 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <EditText + android:id="@+id/textview" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + +</LinearLayout>
\ No newline at end of file diff --git a/core/tests/coretests/src/android/widget/TextViewActivity.java b/core/tests/coretests/src/android/widget/TextViewActivity.java new file mode 100644 index 000000000000..d4945ba94dd4 --- /dev/null +++ b/core/tests/coretests/src/android/widget/TextViewActivity.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.widget; + +import com.android.frameworks.coretests.R; + +import android.app.Activity; +import android.os.Bundle; + +/** + * An activity for testing the TextView widget. + */ +public class TextViewActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_text_view); + } +} diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java new file mode 100644 index 000000000000..54117df35a01 --- /dev/null +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.widget; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.typeTextIntoFocusedView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +import com.android.frameworks.coretests.R; + +import android.test.ActivityInstrumentationTestCase2; +import android.test.suitebuilder.annotation.SmallTest; + +/** + * Tests the TextView widget from an Activity + */ +public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextViewActivity>{ + + public TextViewActivityTest() { + super(TextViewActivity.class); + } + + @SmallTest + public void testTypedTextIsOnScreen() throws Exception { + getActivity(); + + final String helloWorld = "Hello world!"; + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(helloWorld)); + + onView(withId(R.id.textview)).check(matches(withText(helloWorld))); + } +} diff --git a/docs/html/tools/data-binding/guide.jd b/docs/html/tools/data-binding/guide.jd index 7c4c15a1be43..2de5bc209d55 100644 --- a/docs/html/tools/data-binding/guide.jd +++ b/docs/html/tools/data-binding/guide.jd @@ -28,6 +28,10 @@ page.tags="databinding", "layouts" <li> <a href="#binding_data">Binding Data</a> </li> + + <li> + <a href="#binding_events">Binding Events</a> + </li> </ol> </li> @@ -141,7 +145,7 @@ page.tags="databinding", "layouts" — it's a support library, so you can use it with all Android platform versions back to <strong>Android 2.1</strong> (API level 7+).</p> -<p>To use data binding, Android Plugin for Gradle <strong>1.3.0-beta1</strong> +<p>To use data binding, Android Plugin for Gradle <strong>1.3.0-beta4</strong> or higher is required.</p> <h4>Beta release</h4> @@ -187,9 +191,9 @@ or higher is required.</p> <p>To get started with Data Binding, download the library from the Support repository in the Android SDK manager. </p> -<p>The Data Binding plugin requires Android Plugin for Gradle <strong>1.3.0-beta1 -or higher</strong>, so update your build dependencies (in -<code>build.gradle</code>) as needed.</p> +<p>The Data Binding plugin requires Android Plugin for Gradle <strong>1.3.0-beta4 +or higher</strong>, so update your build dependencies (in the top-level +<code>build.gradle</code> file) as needed.</p> <p>Also, make sure you are using a compatible version of Android Studio. <strong>Android Studio 1.3</strong> adds the code-completion and layout-preview @@ -201,18 +205,18 @@ support for data binding.</p> <p> To set up your application to use data binding, add data binding to the class - path of your <code>build.gradle</code> file, right below "android". + path of your top-level <code>build.gradle</code> file, right below "android". </p> <pre> dependencies { - classpath <strong>"com.android.tools.build:gradle:1.3.0-beta1" - </strong>classpath <strong>"com.android.databinding:dataBinder:</strong>1.0-rc0" + classpath <strong>"com.android.tools.build:gradle:1.3.0-beta4"</strong> + classpath <strong>"com.android.databinding:dataBinder:1.0-rc1"</strong> } -} </pre> <p> - Then make sure jcenter is in the repositories list for your sub projects. + Then make sure jcenter is in the repositories list for your projects in the top-level + <code>build.gradle</code> file. </p> <pre> @@ -228,8 +232,8 @@ allprojects { </p> <pre> -apply plugin: ‘com.android.application' -apply plugin: '<strong>com.android.databinding</strong>' +apply plugin: 'com.android.application' +apply plugin: 'com.android.databinding' </pre> <p> The data binding plugin is going to add necessary <strong>provided</strong> @@ -252,23 +256,23 @@ apply plugin: '<strong>com.android.databinding</strong>' </p> <pre> -<em><?</em><strong>xml version="1.0" encoding="utf-8"</strong><em>?> -</em><<strong>layout xmlns:android="http://schemas.android.com/apk/res/android"</strong>> - <<strong>data</strong>> - <<strong>variable name="user" type="com.example.User"</strong>/> - </<strong>data</strong>> - <<strong>LinearLayout +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android"> + <data> + <variable name="user" type="com.example.User"/> + </data> + <LinearLayout android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"</strong>> - <<strong>TextView android:layout_width="wrap_content" + android:layout_height="match_parent"> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{user.firstName}"</strong>/> - <<strong>TextView android:layout_width="wrap_content" + android:text="@{user.firstName}"/> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{user.lastName}"</strong>/> - </<strong>LinearLayout</strong>> -</<strong>layout</strong>> + android:text="@{user.lastName}"/> + </LinearLayout> +</layout> </pre> <p> The user <strong>variable</strong> within <strong>data</strong> describes a @@ -285,9 +289,9 @@ apply plugin: '<strong>com.android.databinding</strong>' </p> <pre> -<<strong>TextView android:layout_width="wrap_content" +<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{user.firstName}"</strong>/> + android:text="@{user.firstName}"/> </pre> <h3 id="data_object"> Data Object @@ -298,12 +302,12 @@ apply plugin: '<strong>com.android.databinding</strong>' </p> <pre> -<strong>public class </strong>User { - <strong>public final </strong>String <strong>firstName</strong>; - <strong>public final </strong>String <strong>lastName</strong>; - <strong>public </strong>User(String firstName, String lastName) { - <strong>this</strong>.<strong>firstName </strong>= firstName; - <strong>this</strong>.<strong>lastName </strong>= lastName; +public class User { + public final String firstName; + public final String lastName; + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; } } </pre> @@ -314,18 +318,18 @@ apply plugin: '<strong>com.android.databinding</strong>' </p> <pre> -<strong>public class </strong>User { - <strong>private final </strong>String <strong>firstName</strong>; - <strong>private final </strong>String <strong>lastName</strong>; - <strong>public </strong>User(String firstName, String lastName) { - <strong>this</strong>.<strong>firstName </strong>= firstName; - <strong>this</strong>.<strong>lastName </strong>= lastName; +public class User { + private final String firstName; + private final String lastName; + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; } - <strong>public </strong>String getFirstName() { - <strong>return this</strong>.<strong>firstName</strong>; + public String getFirstName() { + return this.firstName; } - <strong>public </strong>String getLastName() { - <strong>return this</strong>.<strong>lastName</strong>; + public String getLastName() { + return this.lastName; } } </pre> @@ -334,7 +338,8 @@ apply plugin: '<strong>com.android.databinding</strong>' expression <strong><code>@{user.firstName}</code></strong> used for the TextView’s <strong><code>android:text</code></strong> attribute will access the <strong><code>firstName</code></strong> field in the former class - and the <code>getFirstName()</code> method in the latter class. + and the <code>getFirstName()</code> method in the latter class. Alternatively, it + will also be resolved to <code>firstName()</code> if that method exists. </p> <h3 id="binding_data"> @@ -344,8 +349,8 @@ apply plugin: '<strong>com.android.databinding</strong>' <p> By default, a Binding class will be generated based on the name of the layout file, converting it to Pascal case and suffixing “Binding” to it. The above - layout file was <code>activity_main.xml</code> so the generate class was - <code>ActivityMainBinding</code>. This class holds all the bindings from the + layout file was <code>main_activity.xml</code> so the generate class was + <code>MainActivityBinding</code>. This class holds all the bindings from the layout properties (e.g. the <code>user</code> variable) to the layout’s Views and knows how to assign values for the binding expressions.The easiest means for creating the bindings is to do it while inflating: @@ -353,10 +358,10 @@ apply plugin: '<strong>com.android.databinding</strong>' <pre> @Override -<strong>protected void </strong>onCreate(Bundle savedInstanceState) { - <strong>super</strong>.onCreate(savedInstanceState); - ActivityMainBinding binding = DataBindingUtil.<em>setContentView</em>(<strong>this</strong>, R.layout.<em><strong>main_activity</strong></em>); - User user = <strong>new </strong>User(<strong>"Test"</strong>, <strong>"User"</strong>); +protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); + User user = new User("Test", "User"); binding.setUser(user); } </pre> @@ -374,11 +379,55 @@ MainActivityBinding binding = MainActivityBinding.<em>inflate</em>(getLayoutInfl </p> <pre> -ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, -false); +ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.layout.<em><strong>list_item</strong></em>, viewGroup, <strong>false</strong>); </pre> + +<h3 id="binding_events"> + Binding Events +</h3> +<p> + Events may be bound to handler methods directly, similar to the way + <strong><code>android:onClick</code></strong> can be assigned to a method in the Activity. + Event attribute names are governed by the name of the listener method with a few exceptions. + For example, {@link android.view.View.OnLongClickListener} has a method {@link android.view.View.OnLongClickListener#onLongClick onLongClick()}, + so the attribute for this event is <code>android:onLongClick</code>. +</p> +<p> + To assign an event to its handler, use a normal binding expression, with the value + being the method name to call. For example, if your data object has two methods: +</p> +<pre>public class MyHandlers { + public void onClickFriend(View view) { ... } + public void onClickEnemy(View view) { ... } +} +</pre> +<p> + The binding expression can assign the click listener for a View: +</p> +<pre> +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android"> + <data> + <variable name="handlers" type="com.example.Handlers"/> + <variable name="user" type="com.example.User"/> + </data> + <LinearLayout + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{user.firstName}" + android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{user.lastName}" + android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> + </LinearLayout> +</layout> +</pre> <h2 id="layout_details"> Layout Details </h2> @@ -394,20 +443,20 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.view.View"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.view.View"/> +</data> </pre> <p> Now, View may be used within your binding expression: </p> <pre> -<<strong>TextView +<TextView android:text="@{user.lastName}" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"</strong>/> + android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/> </pre> <p> When there are class name conflicts, one of the classes may be renamed to an @@ -415,9 +464,9 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>import type="android.view.View"</strong>/> -<<strong>import type="com.example.real.estate.View" - alias="Vista"</strong>/> +<import type="android.view.View"/> +<import type="com.example.real.estate.View" + alias="Vista"/> </pre> <p> Now, <strong><code>Vista</code></strong> may be used to reference the @@ -428,12 +477,12 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data</strong>> - <<strong>import type="com.example.User"</strong>/> - <<strong>import type="java.util.List"</strong>/> - <<strong>variable name="user" type="User"</strong>/> - <<strong>variable name="userList" type="List&lt;User>"</strong>/> - </<strong>data</strong>> +<data> + <import type="com.example.User"/> + <import type="java.util.List"/> + <variable name="user" type="User"/> + <variable name="userList" type="List&lt;User>"/> +</data> </pre> <p class="caution"> <strong>Note</strong>: Android Studio does not yet handle imports so the @@ -443,10 +492,10 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>TextView +<TextView android:text="@{((User)(user.connection)).lastName}" android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <p> Imported types may also be used when referencing static fields and methods in @@ -454,15 +503,15 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data</strong>> - <<strong>import type="com.example.MyStringUtils"</strong>/> - <<strong>variable name="user" type="com.example.User"</strong>/> -</<strong>data</strong>> +<data> + <import type="com.example.MyStringUtils"/> + <variable name="user" type="com.example.User"/> +</data> … -<<strong>TextView +<TextView android:text="@{MyStringUtils.capitalize(user.lastName)}" android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <p> Just as in Java, <code>java.lang.*</code> is imported automatically. @@ -481,16 +530,16 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.graphics.drawable.Drawable"</strong>/> - <<strong>variable name="user" type="com.example.User"</strong>/> - <<strong>variable name="image" type="Drawable"</strong>/> - <<strong>variable name="note" type="String"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.graphics.drawable.Drawable"/> + <variable name="user" type="com.example.User"/> + <variable name="image" type="Drawable"/> + <variable name="note" type="String"/> +</data> </pre> <p> The variable types are inspected at compile time, so if a variable implements - <a href="#observable_objects">Observable</a> or is an <a href= + {@link android.databinding.Observable} or is an <a href= "#observable_collections">observable collection</a>, that should be reflected in the type. If the variable is a base class or interface that does not implement the Observable* interface, the variables will <strong>not @@ -533,9 +582,9 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data class="ContactItem"</strong>> +<data class="ContactItem"> ... -</<strong>data</strong>> +</data> </pre> <p> This generates the binding class as <code>ContactItem</code> in the @@ -545,9 +594,9 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data class=".ContactItem"</strong>> +<data class=".ContactItem"> ... -</<strong>data</strong>> +</data> </pre> <p> In this case, <code>ContactItem</code> is generated in the module package @@ -555,9 +604,9 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<<strong>data class="com.example.ContactItem"</strong>> +<data class="com.example.ContactItem"> ... -</<strong>data</strong>> +</data> </pre> <h3 id="includes"> Includes @@ -570,28 +619,46 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<em><?</em><strong>xml version="1.0" encoding="utf-8"</strong><em>?> -</em><<strong>layout xmlns:android="http://schemas.android.com/apk/res/android" -</strong> <strong> xmlns:bind="http://schemas.android.com/apk/res-auto"</strong>> - <<strong>data</strong>> - <<strong>variable name="user" type="com.example.User"</strong>/> - </<strong>data</strong>> - <<strong>LinearLayout +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:bind="http://schemas.android.com/apk/res-auto"> + <data> + <variable name="user" type="com.example.User"/> + </data> + <LinearLayout android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"</strong>> - <<strong>include layout="@layout/name" - bind:user="@{user}"</strong>/> - <<strong>include layout="@layout/contact" - bind:user="@{user}"</strong>/> - </<strong>LinearLayout</strong>> -</<strong>layout</strong>> + android:layout_height="match_parent"> + <include layout="@layout/name" + bind:user="@{user}"/> + <include layout="@layout/contact" + bind:user="@{user}"/> + </LinearLayout> +</layout> </pre> <p> Here, there must be a <code>user</code> variable in both the <code>name.xml</code> and <code>contact.xml</code> layout files. </p> - +<p> + Data binding does not support include as a direct child of a merge element. For example, + <strong>the following layout is not supported:</strong> +</p> +<pre> +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:bind="http://schemas.android.com/apk/res-auto"> + <data> + <variable name="user" type="com.example.User"/> + </data> + <merge> + <include layout="@layout/name" + bind:user="@{user}"/> + <include layout="@layout/contact" + bind:user="@{user}"/> + </merge> +</layout> +</pre> <h3 id="expression_language"> Expression Language </h3> @@ -613,10 +680,10 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </li> <li> - <code>L</code>ogical <strong><code>&& ||</code></strong> + Logical <strong><code>&& ||</code></strong> </li> - <li>Binary <strong><code>&</code> <code>|</code> <code>^</code></strong> + <li>Binary <strong><code>& | ^</code></strong> </li> <li>Unary <strong><code>+ - ! ~</code></strong> @@ -659,9 +726,9 @@ ListItemBinding binding = DataBindingUtil.<em>inflate</em>(layoutInflater, R.lay </p> <pre> -<strong>android:text="@{String.valueOf(index + 1)}" +android:text="@{String.valueOf(index + 1)}" android:visibility="@{age &lt; 13 ? View.GONE : View.VISIBLE}" -android:transitionName='@{"image_" + id}'</strong> +android:transitionName='@{"image_" + id}' </pre> <h4 id="missing_operations"> Missing Operations @@ -746,23 +813,23 @@ android:transitionName='@{"image_" + id}'</strong> </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.util.SparseArray"</strong>/> - <<strong>import type="java.util.Map"</strong>/> - <<strong>import type="java.util.List"</strong>/> - <<strong>variable name="list" type="List<String>"</strong>/> - <<strong>variable name="sparse" type="SparseArray&lt;String>"</strong>/> - <<strong>variable name="map" type="Map&lt;String, String>"</strong>/> - <<strong>variable name="index" type="int"</strong>/> - <<strong>variable name="key" type="String"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.util.SparseArray"/> + <import type="java.util.Map"/> + <import type="java.util.List"/> + <variable name="list" type="List&lt;String>"/> + <variable name="sparse" type="SparseArray&lt;String>"/> + <variable name="map" type="Map&lt;String, String>"/> + <variable name="index" type="int"/> + <variable name="key" type="String"/> +</data> +… +android:text="@{list[index]}" … -<strong>android:text="@{list[index]}" -</strong>… -<strong>android:text="@{sparse[index]}" -</strong>… -<strong>android:text="@{map[key]}" -</strong> +android:text="@{sparse[index]}" +… +android:text="@{map[key]}" + </pre> <h4 id="string_literals"> String Literals @@ -774,7 +841,7 @@ android:transitionName='@{"image_" + id}'</strong> </p> <pre> -<strong>android:text='@{map["firstName"]}'</strong> +android:text='@{map["firstName"]}' </pre> <p> It is also possible to use double quotes to surround the attribute value. @@ -783,8 +850,8 @@ android:transitionName='@{"image_" + id}'</strong> </p> <pre> -<strong>android:text="@{map[`firstName`}" -android:text="@{map[&quot;firstName&quot;]}"</strong> +android:text="@{map[`firstName`}" +android:text="@{map[&quot;firstName&quot;]}" </pre> <h4 id="resources"> Resources @@ -796,15 +863,15 @@ android:text="@{map[&quot;firstName&quot;]}"</strong> </p> <pre> -<strong>android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"</strong> +android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}" </pre> <p> Format strings and plurals may be evaluated by providing parameters: </p> <pre> -<strong>android:text="@{@string/nameFormat(firstName, lastName)}" -android:text="@{@plurals/banana(bananaCount)}"</strong> +android:text="@{@string/nameFormat(firstName, lastName)}" +android:text="@{@plurals/banana(bananaCount)}" </pre> <p> When a plural takes multiple parameters, all parameters should be passed: @@ -815,7 +882,7 @@ android:text="@{@plurals/banana(bananaCount)}"</strong> Have an orange Have %d oranges -android:text="<strong>@{@plurals/orange(orangeCount, orangeCount)}</strong>" +android:text="@{@plurals/orange(orangeCount, orangeCount)}" </pre> <p> Some resources require explicit type evaluation. @@ -836,9 +903,7 @@ android:text="<strong>@{@plurals/orange(orangeCount, orangeCount)} <tr> <td> - <pre> -String[] -</pre> + String[] </td> <td> @array @@ -901,9 +966,7 @@ String[] color <code>int</code> </td> <td> - <pre> -@color -</pre> + @color </td> <td> @color @@ -932,8 +995,9 @@ String[] a POJO will not cause the UI to update. The real power of data binding can be used by giving your data objects the ability to notify when data changes. There are three different data change notification mechanisms, - <code>Observable</code> objects, <code>ObservableField</code>s, and - <code>observable collections</code>. + <a href="#observable_objects">Observable objects</a>, + <a href="#observablefields">observable fields</a>, and + <a href="#observable_collections">observable collection</a>s. </p> <p> @@ -946,49 +1010,49 @@ String[] </h3> <p> - A class implementing <code>android.databinding.Observable</code> interface + A class implementing the {@link android.databinding.Observable} interface will allow the binding to attach a single listener to a bound object to listen for changes of all properties on that object. </p> <p> - The <code>Observable</code> interface has a mechanism to add and remove + The {@link android.databinding.Observable} interface has a mechanism to add and remove listeners, but notifying is up to the developer. To make development easier, - a base class, <code>BaseObservable,</code> was created to implement the + a base class, {@link android.databinding.BaseObservable}, was created to implement the listener registration mechanism. The data class implementer is still responsible for notifying when the properties change. This is done by - assigning a <code>Bindable</code> annotation to the getter and notifying in + assigning a {@link android.databinding.Bindable} annotation to the getter and notifying in the setter. </p> <pre> -<strong>private static class </strong>User <strong>extends </strong>BaseObservable { - <strong>private </strong>String <strong>firstName</strong>; - <strong>private </strong>String <strong>lastName</strong>; +private static class User extends BaseObservable { + private String firstName; + private String lastName; @Bindable - <strong>public </strong>String getFirstName() { - <strong>return this</strong>.<strong>firstName</strong>; + public String getFirstName() { + return this.firstName; } @Bindable - <strong>public </strong>String getFirstName() { - <strong>return this</strong>.<strong>lastName</strong>; + public String getLastName() { + return this.lastName; } - <strong>public void </strong>setFirstName(String firstName) { - <strong>this</strong>.<strong>firstName </strong>= firstName; + public void setFirstName(String firstName) { + this.firstName = firstName; notifyPropertyChanged(BR.firstName); } - <strong>public void </strong>setLastName(String lastName) { - <strong>this</strong>.<strong>lastName </strong>= lastName; + public void setLastName(String lastName) { + this.lastName = lastName; notifyPropertyChanged(BR.lastName); } } </pre> <p> - The <code>Bindable</code> annotation generates an entry in the BR class file + The {@link android.databinding.Bindable} annotation generates an entry in the BR class file during compilation. The BR class file will be generated in the module - package.If the base class for data classes cannot be changed, the - <code>Observable</code> interface may be implemented using the convenient - <code>PropertyChangeRegistry</code> to store and notify listeners + package. If the base class for data classes cannot be changed, the + {@link android.databinding.Observable} interface may be implemented using the convenient + {@link android.databinding.PropertyChangeRegistry} to store and notify listeners efficiently. </p> @@ -997,20 +1061,30 @@ String[] </h3> <p> - A little work is involved in creating Observable classes, so developers who - want to save time or have few properties may use ObservableFields. - ObservableFields are self-contained observable objects that have a single - field. There are versions for all primitive types and one for reference - types. To use, create a public final field in the data class: + A little work is involved in creating {@link android.databinding.Observable} classes, so + developers who want to save time or have few properties may use + {@link android.databinding.ObservableField} and its siblings + {@link android.databinding.ObservableBoolean}, + {@link android.databinding.ObservableByte}, + {@link android.databinding.ObservableChar}, + {@link android.databinding.ObservableShort}, + {@link android.databinding.ObservableInt}, + {@link android.databinding.ObservableLong}, + {@link android.databinding.ObservableFloat}, + {@link android.databinding.ObservableDouble}, and + {@link android.databinding.ObservableParcelable}. + <code>ObservableFields</code> are self-contained observable objects that have a single + field. The primitive versions avoid boxing and unboxing during access operations. + To use, create a public final field in the data class: </p> <pre> -<strong>private static class </strong>User <strong>extends </strong>BaseObservable { - <strong>public final </strong>ObservableField<String> <strong>firstName </strong>= - <strong>new </strong>ObservableField<>(); - <strong>public final </strong>ObservableField<String> <strong>lastName </strong>= - <strong>new </strong>ObservableField<>(); - <strong>public final </strong>ObservableInt <strong>age </strong>= <strong>new </strong>ObservableInt(); +private static class User { + public final ObservableField<String> firstName = + new ObservableField<>(); + public final ObservableField<String> lastName = + new ObservableField<>(); + public final ObservableInt age = new ObservableInt(); } </pre> <p> @@ -1018,8 +1092,8 @@ String[] </p> <pre> -user.<strong>firstName</strong>.set(<strong>"Google"</strong>); -<strong>int </strong>age = user.<strong>age</strong>.get(); +user.firstName.set("Google"); +int age = user.age.get(); </pre> <h3 id="observable_collections"> Observable Collections @@ -1027,43 +1101,44 @@ user.<strong>firstName</strong>.set(<strong>"Google"</strong>); <p> Some applications use more dynamic structures to hold data. Observable - collections allow keyed access to these data objects.ObservableArrayMap is + collections allow keyed access to these data objects. + {@link android.databinding.ObservableArrayMap} is useful when the key is a reference type, such as String. </p> <pre> -ObservableArrayMap<String, Object> user = <strong>new </strong>ObservableArrayMap<>(); -user.put(<strong>"firstName"</strong>, <strong>"Google"</strong>); -user.put(<strong>"lastName"</strong>, <strong>"Inc."</strong>); -user.put(<strong>"age"</strong>, 17); +ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); +user.put("firstName", "Google"); +user.put("lastName", "Inc."); +user.put("age", 17); </pre> <p> In the layout, the map may be accessed through the String keys: </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.databinding.ObservableMap"</strong>/> - <<strong>variable name="user" type="ObservableMap&lt;String, Object>"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.databinding.ObservableMap"/> + <variable name="user" type="ObservableMap&lt;String, Object>"/> +</data> … -<<strong>TextView +<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> -<<strong>TextView + android:layout_height="wrap_content"/> +<TextView android:text='@{String.valueOf(1 + (Integer)user["age"])}' android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <p> - ObservableArrayList is useful when the key is an integer: + {@link android.databinding.ObservableArrayList} is useful when the key is an integer: </p> <pre> -ObservableArrayList<Object> user = <strong>new </strong>ObservableArrayList<>(); -user.add(<strong>"Google"</strong>); -user.add(<strong>"Inc."</strong>); +ObservableArrayList<Object> user = new ObservableArrayList<>(); +user.add("Google"); +user.add("Inc."); user.add(17); </pre> <p> @@ -1071,20 +1146,20 @@ user.add(17); </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.databinding.ObservableList"</strong>/> - <<strong>import type="com.example.my.app.Fields"</strong>/> - <<strong>variable name="user" type="ObservableList&lt;Object>"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.databinding.ObservableList"/> + <import type="com.example.my.app.Fields"/> + <variable name="user" type="ObservableList&lt;Object>"/> +</data> … -<<strong>TextView +<TextView android:text='@{user[Fields.LAST_NAME]}' android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> -<<strong>TextView + android:layout_height="wrap_content"/> +<TextView android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}' android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <h2 id="generated_binding"> Generated Binding @@ -1094,7 +1169,7 @@ user.add(17); The generated binding class links the layout variables with the Views within the layout. As discussed earlier, the name and package of the Binding may be <a href="#custom_binding_class_names">customized</a>. The Generated binding - classes all extend <code>android.databinding.ViewDataBinding</code>. + classes all extend {@link android.databinding.ViewDataBinding}. </p> <h3 id="creating"> @@ -1107,13 +1182,13 @@ user.add(17); within the layout. There are a few ways to bind to a layout. The most common is to use the static methods on the Binding class.The inflate method inflates the View hierarchy and binds to it all it one step. There is a simpler - version that only takes a <code>LayoutInflater</code> and one that takes a - <code>ViewGroup</code> as well: + version that only takes a {@link android.view.LayoutInflater} and one that takes a + {@link android.view.ViewGroup} as well: </p> <pre> -MyLayoutBinding binding = MyLayoutBinding.<em>inflate</em>(<strong>layoutInflater</strong>); -MyLayoutBinding binding = MyLayoutBinding.<em>inflate</em>(LayoutInflater, viewGroup, false); +MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater); +MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false); </pre> <p> If the layout was inflated using a different mechanism, it may be bound @@ -1121,17 +1196,17 @@ MyLayoutBinding binding = MyLayoutBinding.<em>inflate</em>(LayoutInflater, viewG </p> <pre> -MyLayoutBinding binding = MyLayoutBinding.<em>bind</em>(viewRoot); +MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot); </pre> <p> Sometimes the binding cannot be known in advance. In such cases, the binding - can be created using the DataBindingUtil class: + can be created using the {@link android.databinding.DataBindingUtil} class: </p> <pre> -ViewDataBinding binding = DataBindingUtil.<em>inflate</em>(LayoutInflater, layoutId, +ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId, parent, attachToParent); -ViewDataBinding binding = DataBindingUtil.<em>bindTo</em>(viewRoot, layoutId); +ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId); </pre> <h3 id="views_with_ids"> Views With IDs @@ -1145,32 +1220,32 @@ ViewDataBinding binding = DataBindingUtil.<em>bindTo</em>(viewRoot, layoutId); </p> <pre> -<<strong>layout xmlns:android="http://schemas.android.com/apk/res/android"</strong>> - <<strong>data</strong>> - <<strong>variable name="user" type="com.example.User"</strong>/> - </<strong>data</strong>> - <<strong>LinearLayout +<layout xmlns:android="http://schemas.android.com/apk/res/android"> + <data> + <variable name="user" type="com.example.User"/> + </data> + <LinearLayout android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"</strong>> - <<strong>TextView android:layout_width="wrap_content" + android:layout_height="match_parent"> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{user.firstName}"</strong> - <strong>android:id="@+id/firstName"</strong>/> - <<strong>TextView android:layout_width="wrap_content" + android:text="@{user.firstName}" + android:id="@+id/firstName"/> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{user.lastName}"</strong> - <strong>android:id="@+id/lastName"</strong>/> - </<strong>LinearLayout</strong>> -</<strong>layout</strong>> + android:text="@{user.lastName}" + android:id="@+id/lastName"/> + </LinearLayout> +</layout> </pre> <p> Will generate a binding class with: </p> <pre> -<strong>public final </strong>TextView <strong>firstName</strong>; -<strong>public final </strong>TextView <strong>lastName</strong>; +public final TextView firstName; +public final TextView lastName; </pre> <p> IDs are not nearly as necessary as without data binding, but there are still @@ -1186,49 +1261,49 @@ ViewDataBinding binding = DataBindingUtil.<em>bindTo</em>(viewRoot, layoutId); </p> <pre> -<<strong>data</strong>> - <<strong>import type="android.graphics.drawable.Drawable"</strong>/> - <<strong>variable name="user" type="com.example.User"</strong>/> - <<strong>variable name="image" type="Drawable"</strong>/> - <<strong>variable name="note" type="String"</strong>/> -</<strong>data</strong>> +<data> + <import type="android.graphics.drawable.Drawable"/> + <variable name="user" type="com.example.User"/> + <variable name="image" type="Drawable"/> + <variable name="note" type="String"/> +</data> </pre> <p> will generate setters and getters in the binding: </p> <pre> -<strong>public abstract </strong>com.example.User getUser(); -<strong>public abstract void </strong>setUser(com.example.User user); -<strong>public abstract </strong>Drawable getImage(); -<strong>public abstract void </strong>setImage(Drawable image); -<strong>public abstract </strong>String getNote(); -<strong>public abstract void </strong>setNote(String note); +public abstract com.example.User getUser(); +public abstract void setUser(com.example.User user); +public abstract Drawable getImage(); +public abstract void setImage(Drawable image); +public abstract String getNote(); +public abstract void setNote(String note); </pre> <h3 id="viewstubs"> ViewStubs </h3> <p> - ViewStubs are a little different from normal Views. They start off invisible + {@link android.view.ViewStub}s are a little different from normal Views. They start off invisible and when they either are made visible or are explicitly told to inflate, they replace themselves in the layout by inflating another layout. </p> <p> - Because the ViewStub essentially disappears from the View hierarchy, the View + Because the <code>ViewStub</code> essentially disappears from the View hierarchy, the View in the binding object must also disappear to allow collection. Because the - Views are final, a ViewStubProxy object takes the place of the ViewStub, - giving the developer access to the ViewStub when it exists and also access to - the inflated View hierarchy when the ViewStub has been inflated. + Views are final, a {@link android.databinding.ViewStubProxy} object takes the place of the + <code>ViewStub</code>, giving the developer access to the ViewStub when it exists and also + access to the inflated View hierarchy when the <code>ViewStub</code> has been inflated. </p> <p> When inflating another layout, a binding must be established for the new - layout. Therefore, the ViewStubProxy must listen to the ViewStub's - OnInflateListener and establish the binding at that time. Since only one can - exist, the ViewStubProxy allows the developer to set an OnInflateListener on - it that it will call after establishing the binding. + layout. Therefore, the <code>ViewStubProxy</code> must listen to the <code>ViewStub</code>'s + {@link android.view.ViewStub.OnInflateListener} and establish the binding at that time. Since + only one can exist, the <code>ViewStubProxy</code> allows the developer to set an + <code>OnInflateListener</code> on it that it will call after establishing the binding. </p> <h3 id="advanced_binding"> @@ -1241,20 +1316,20 @@ ViewDataBinding binding = DataBindingUtil.<em>bindTo</em>(viewRoot, layoutId); <p> At times, the specific binding class won't be known. For example, a - RecyclerView Adapter operating against arbitrary layouts won't know the - specific binding class. It still must assign the binding value during the - onBindViewHolder. + {@link android.support.v7.widget.RecyclerView.Adapter} operating against arbitrary layouts + won't know the specific binding class. It still must assign the binding value during the + {@link android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder}. </p> <p> In this example, all layouts that the RecyclerView binds to have an "item" - variable. The BindingHolder has a getBinding method returning the - <code>ViewDataBinding</code> base. + variable. The <code>BindingHolder</code> has a <code>getBinding</code> method returning the + {@link android.databinding.ViewDataBinding} base. </p> <pre> -<strong>public void </strong>onBindViewHolder(BindingHolder holder, <strong>int </strong>position) { - <strong>final </strong>T item = <strong>mItems</strong>.get(position); +public void onBindViewHolder(BindingHolder holder, int position) { + final T item = mItems.get(position); holder.getBinding().setVariable(BR.item, item); holder.getBinding().executePendingBindings(); } @@ -1267,7 +1342,7 @@ ViewDataBinding binding = DataBindingUtil.<em>bindTo</em>(viewRoot, layoutId); When a variable or observable changes, the binding will be scheduled to change before the next frame. There are times, however, when binding must be executed immediately. To force execution, use the - <code>executePendingBindings()</code> method. + {@link android.databinding.ViewDataBinding#executePendingBindings()} method. </p> <h4> @@ -1321,17 +1396,18 @@ namespace for the attribute does not matter, only the attribute name itself. <p> Some attributes have setters that don't match by name. For these methods, an attribute may be associated with the setter through - BindingMethods annotation. This must be associated with a class and contains - BindingMethod annotations, one for each renamed method. For example, the - <strong><code>android:tint</code></strong> attribute is really associated - with setImageTintList, not setTint. + {@link android.databinding.BindingMethods} annotation. This must be associated with + a class and contains {@link android.databinding.BindingMethod} annotations, one for + each renamed method. For example, the <strong><code>android:tint</code></strong> attribute + is really associated with {@link android.widget.ImageView#setImageTintList}, not + <code>setTint</code>. </p> <pre> @BindingMethods({ - @BindingMethod(type = <strong>"android.widget.ImageView"</strong>, - attribute = <strong>"android:tint"</strong>, - method = <strong>"setImageTintList"</strong>), + @BindingMethod(type = "android.widget.ImageView", + attribute = "android:tint", + method = "setImageTintList"), }) </pre> <p> @@ -1347,7 +1423,7 @@ namespace for the attribute does not matter, only the attribute name itself. Some attributes need custom binding logic. For example, there is no associated setter for the <strong><code>android:paddingLeft</code></strong> attribute. Instead, <code>setPadding(left, top, right, bottom)</code> exists. - A static binding adapter method with the <code>BindingAdapter</code> + A static binding adapter method with the {@link android.databinding.BindingAdapter} annotation allows the developer to customize how a setter for an attribute is called. </p> @@ -1358,9 +1434,8 @@ namespace for the attribute does not matter, only the attribute name itself. </p> <pre> - -@BindingAdapter(<strong>"android:paddingLeft"</strong>) -<strong>public static void </strong>setPaddingLeft(View view, <strong>int </strong>padding) { +@BindingAdapter("android:paddingLeft") +public static void setPaddingLeft(View view, int padding) { view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), @@ -1382,9 +1457,9 @@ namespace for the attribute does not matter, only the attribute name itself. </p> <pre> -@BindingAdapter({<strong>"bind:imageUrl"</strong>, <strong>"bind:error"</strong>}) -<strong>public static void </strong>loadImage(ImageView view, String url, Drawable error) { - Picasso.<em>with</em>(view.getContext()).load(url).error(error).into(view); +@BindingAdapter({"bind:imageUrl", "bind:error"}) +public static void loadImage(ImageView view, String url, Drawable error) { + Picasso.with(view.getContext()).load(url).error(error).into(view); } </pre> <pre> @@ -1406,6 +1481,123 @@ app:error=“@{@drawable/venueError}”/> </li> </ul> +<p> + Binding adapter methods may optionally take the old values in their handlers. A method + taking old and new values should have all old values for the attributes come first, followed + by the new values: +</p> +<pre> +@BindingAdapter("android:paddingLeft") +public static void setPaddingLeft(View view, int oldPadding, int newPadding) { + if (oldPadding != newPadding) { + view.setPadding(newPadding, + view.getPaddingTop(), + view.getPaddingRight(), + view.getPaddingBottom()); + } +} +</pre> +<p> + Event handlers may only be used with interfaces or abstract classes with one abstract method. + For example: +</p> +<pre> +@BindingAdapter("android:onLayoutChange") +public static void setOnLayoutChangeListener(View view, View.OnLayoutChangeListener oldValue, + View.OnLayoutChangeListener newValue) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (oldValue != null) { + view.removeOnLayoutChangeListener(oldValue); + } + if (newValue != null) { + view.addOnLayoutChangeListener(newValue); + } + } +} +</pre> +<p> + When a listener has multiple methods, it must be split into multiple listeners. For example, + {@link android.view.View.OnAttachStateChangeListener} has two methods: + {@link android.view.View.OnAttachStateChangeListener#onViewAttachedToWindow onViewAttachedToWindow()} and + {@link android.view.View.OnAttachStateChangeListener#onViewDetachedFromWindow onViewDetachedFromWindow()}. + We must then create two interfaces to differentiate the attributes and handlers for them. +</p> + +<pre> +@TargetApi(VERSION_CODES.HONEYCOMB_MR1) +public interface OnViewDetachedFromWindow { + void onViewDetachedFromWindow(View v); +} + +@TargetApi(VERSION_CODES.HONEYCOMB_MR1) +public interface OnViewAttachedToWindow { + void onViewAttachedToWindow(View v); +} +</pre> +<p> + Because changing one listener will also affect the other, we must have three different + binding adapters, one for each attribute and one for both, should they both be set. +</p> +<pre> +@BindingAdapter("android:onViewAttachedToWindow") +public static void setListener(View view, OnViewAttachedToWindow attached) { + setListener(view, null, attached); +} + +@BindingAdapter("android:onViewDetachedFromWindow") +public static void setListener(View view, OnViewDetachedFromWindow detached) { + setListener(view, detached, null); +} + +@BindingAdapter({"android:onViewDetachedFromWindow", "android:onViewAttachedToWindow"}) +public static void setListener(View view, final OnViewDetachedFromWindow detach, + final OnViewAttachedToWindow attach) { + if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1) { + final OnAttachStateChangeListener newListener; + if (detach == null && attach == null) { + newListener = null; + } else { + newListener = new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + if (attach != null) { + attach.onViewAttachedToWindow(v); + } + } + + @Override + public void onViewDetachedFromWindow(View v) { + if (detach != null) { + detach.onViewDetachedFromWindow(v); + } + } + }; + } + final OnAttachStateChangeListener oldListener = ListenerUtil.trackListener(view, + newListener, R.id.onAttachStateChangeListener); + if (oldListener != null) { + view.removeOnAttachStateChangeListener(oldListener); + } + if (newListener != null) { + view.addOnAttachStateChangeListener(newListener); + } + } +} +</pre> +<p> + The above example is slightly more complicated than normal because View uses add and remove + for the listener instead of a set method for {@link android.view.View.OnAttachStateChangeListener}. + The <code>android.databinding.adapters.ListenerUtil</code> class helps keep track of the previous + listeners so that they may be removed in the Binding Adaper. +</p> +<p> + By annotating the interfaces <code>OnViewDetachedFromWindow</code> and + <code>OnViewAttachedToWindow</code> with + <code>@TargetApi(VERSION_CODES.HONEYCOMB_MR1)</code>, the data binding code + generator knows that the listener should only be generated when running on Honeycomb MR1 + and new devices, the same version supported by + {@link android.view.View#addOnAttachStateChangeListener}. +</p> <h2 id="converters"> Converters </h2> @@ -1426,10 +1618,10 @@ app:error=“@{@drawable/venueError}”/> </p> <pre> -<<strong>TextView +<TextView android:text='@{userMap["lastName"]}' android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <p> @@ -1447,10 +1639,10 @@ The <code>userMap</code> returns an Object and that Object will be automatically </p> <pre> -<<strong>View +<View android:background="@{isError ? @color/red : @color/white}" android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> <p> Here, the background takes a <code>Drawable</code>, but the color is an @@ -1462,8 +1654,8 @@ The <code>userMap</code> returns an Object and that Object will be automatically <pre> @BindingConversion -<strong>public static </strong>ColorDrawable convertColorToDrawable(<strong>int </strong>color) { - <strong>return new </strong>ColorDrawable(color); +public static ColorDrawable convertColorToDrawable(int color) { + return new ColorDrawable(color); } </pre> <p> @@ -1472,8 +1664,8 @@ The <code>userMap</code> returns an Object and that Object will be automatically </p> <pre> -<<strong>View +<View android:background="@{isError ? @drawable/error : @color/white}" android:layout_width="wrap_content" - android:layout_height="wrap_content"</strong>/> + android:layout_height="wrap_content"/> </pre> diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 73caf683ff3c..7bcc7f903964 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -215,7 +215,9 @@ public class Canvas { } /** @hide */ - public void setHighContrastText(boolean highContrastText) {} + public void setHighContrastText(boolean highContrastText) { + native_setHighContrastText(mNativeCanvasWrapper, highContrastText); + } /** @hide */ public void insertReorderBarrier() {} @@ -1974,6 +1976,7 @@ public class Canvas { private static native void native_setBitmap(long canvasHandle, Bitmap bitmap); private static native boolean native_isOpaque(long canvasHandle); + private static native void native_setHighContrastText(long renderer, boolean highContrastText); private static native int native_getWidth(long canvasHandle); private static native int native_getHeight(long canvasHandle); diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java index 6b36a5846d95..79095f42cd06 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -63,7 +63,6 @@ import java.security.spec.ECGenParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -215,7 +214,14 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + // MD5 was never offered for Android Keystore for ECDSA. + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); break; case KeymasterDefs.KM_ALGORITHM_RSA: specBuilder = new KeyGenParameterSpec.Builder( @@ -225,11 +231,23 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato | KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_MD5, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); // Authorized to be used with any encryption and signature padding - // scheme (including no padding). + // schemes (including no padding). specBuilder.setEncryptionPaddings( - KeyProperties.ENCRYPTION_PADDING_NONE); + KeyProperties.ENCRYPTION_PADDING_NONE, + KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1, + KeyProperties.ENCRYPTION_PADDING_RSA_OAEP); + specBuilder.setSignaturePaddings( + KeyProperties.SIGNATURE_PADDING_RSA_PKCS1, + KeyProperties.SIGNATURE_PADDING_RSA_PSS); // Disable randomized encryption requirement to support encryption // padding NONE above. specBuilder.setRandomizedEncryptionRequired(false); @@ -724,27 +742,11 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato // We use Bouncy Castle to generate self-signed RSA certificates. Bouncy Castle // only supports RSA certificates signed using PKCS#1 padding scheme. The key needs // to be authorized for PKCS#1 padding or padding NONE which means any padding. - boolean pkcs1SignaturePaddingSupported = false; - for (int keymasterPadding : KeyProperties.SignaturePadding.allToKeymaster( - spec.getSignaturePaddings())) { - if ((keymasterPadding == KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN) - || (keymasterPadding == KeymasterDefs.KM_PAD_NONE)) { - pkcs1SignaturePaddingSupported = true; - break; - } - } - if (!pkcs1SignaturePaddingSupported) { - // Keymaster doesn't distinguish between encryption padding NONE and signature - // padding NONE. In the Android Keystore API only encryption padding NONE is - // exposed. - for (int keymasterPadding : KeyProperties.EncryptionPadding.allToKeymaster( - spec.getEncryptionPaddings())) { - if (keymasterPadding == KeymasterDefs.KM_PAD_NONE) { - pkcs1SignaturePaddingSupported = true; - break; - } - } - } + boolean pkcs1SignaturePaddingSupported = + com.android.internal.util.ArrayUtils.contains( + KeyProperties.SignaturePadding.allToKeymaster( + spec.getSignaturePaddings()), + KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN); if (!pkcs1SignaturePaddingSupported) { // Key not authorized for PKCS#1 signature padding -- can't sign return null; @@ -803,14 +805,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato : KeyProperties.Digest.allToKeymaster(supportedSignatureDigests)) { supportedKeymasterSignatureDigests.add(keymasterDigest); } - if (authorizedKeymasterKeyDigests.contains(KeymasterDefs.KM_DIGEST_NONE)) { - // Key is authorized to be used with any digest - return supportedKeymasterSignatureDigests; - } else { - // Key is authorized to be used only with specific digests. - Set<Integer> result = new HashSet<Integer>(supportedKeymasterSignatureDigests); - result.retainAll(authorizedKeymasterKeyDigests); - return result; - } + Set<Integer> result = new HashSet<Integer>(supportedKeymasterSignatureDigests); + result.retainAll(authorizedKeymasterKeyDigests); + return result; } } diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java index 915d86fc2e84..d300a9297054 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java @@ -292,7 +292,14 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { new KeyProtection.Builder( KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); + // MD5 was never offered for Android Keystore for ECDSA. + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) { specBuilder = new KeyProtection.Builder( @@ -301,13 +308,25 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { | KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY); // Authorized to be used with any digest (including no digest). - specBuilder.setDigests(KeyProperties.DIGEST_NONE); - // Authorized to be used with any encryption and signature padding scheme (including no - // padding). + specBuilder.setDigests( + KeyProperties.DIGEST_NONE, + KeyProperties.DIGEST_MD5, + KeyProperties.DIGEST_SHA1, + KeyProperties.DIGEST_SHA224, + KeyProperties.DIGEST_SHA256, + KeyProperties.DIGEST_SHA384, + KeyProperties.DIGEST_SHA512); + // Authorized to be used with any encryption and signature padding + // schemes (including no padding). specBuilder.setEncryptionPaddings( - KeyProperties.ENCRYPTION_PADDING_NONE); - // Disable randomized encryption requirement to support encryption padding NONE - // above. + KeyProperties.ENCRYPTION_PADDING_NONE, + KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1, + KeyProperties.ENCRYPTION_PADDING_RSA_OAEP); + specBuilder.setSignaturePaddings( + KeyProperties.SIGNATURE_PADDING_RSA_PKCS1, + KeyProperties.SIGNATURE_PADDING_RSA_PSS); + // Disable randomized encryption requirement to support encryption + // padding NONE above. specBuilder.setRandomizedEncryptionRequired(false); } else { throw new KeyStoreException("Unsupported key algorithm: " + keyAlgorithm); diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index faaa1a618c37..7605231fa991 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -65,17 +65,16 @@ import javax.security.auth.x500.X500Principal; * * <p>NOTE: If a private key is not authorized to sign the self-signed certificate, then the * certificate will be created with an invalid signature which will not verify. Such a certificate - * is still useful because it provides access to the public key. To generate a valid - * signature for the certificate the key needs to be authorized for all of the following: + * is still useful because it provides access to the public key. To generate a valid signature for + * the certificate the key needs to be authorized for all of the following: * <ul> * <li>{@link KeyProperties#PURPOSE_SIGN},</li> * <li>operation without requiring the user to be authenticated (see * {@link Builder#setUserAuthenticationRequired(boolean)}),</li> * <li>signing/origination at this moment in time (see {@link Builder#setKeyValidityStart(Date)} * and {@link Builder#setKeyValidityForOriginationEnd(Date)}),</li> - * <li>suitable digest or {@link KeyProperties#DIGEST_NONE},</li> - * <li>(RSA keys only) padding scheme {@link KeyProperties#SIGNATURE_PADDING_RSA_PKCS1} or - * {@link KeyProperties#ENCRYPTION_PADDING_NONE}.</li> + * <li>suitable digest,</li> + * <li>(RSA keys only) padding scheme {@link KeyProperties#SIGNATURE_PADDING_RSA_PKCS1}.</li> * </ul> * * <p>NOTE: The key material of the generated symmetric and private keys is not accessible. The key @@ -668,7 +667,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>For RSA private keys used by TLS/SSL servers to authenticate themselves to clients it * is usually necessary to authorize the use of no/any padding - * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}). This is because RSA decryption is + * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}) and/or PKCS#1 encryption padding + * ({@link KeyProperties#ENCRYPTION_PADDING_RSA_PKCS1}). This is because RSA decryption is * required by some cipher suites, and some stacks request decryption using no padding * whereas others request PKCS#1 padding. * diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java index 2b49297841de..d6b1cf1da8a2 100644 --- a/keystore/java/android/security/keystore/KeyProperties.java +++ b/keystore/java/android/security/keystore/KeyProperties.java @@ -364,9 +364,6 @@ public abstract class KeyProperties { /** * No encryption padding. - * - * <p><b>NOTE</b>: If a key is authorized to be used with no padding, then it can be used with - * any padding scheme, both for encryption and signing. */ public static final String ENCRYPTION_PADDING_NONE = "NoPadding"; @@ -513,9 +510,6 @@ public abstract class KeyProperties { /** * No digest: sign/authenticate the raw message. - * - * <p><b>NOTE</b>: If a key is authorized to be used with no digest, then it can be used with - * any digest. */ public static final String DIGEST_NONE = "NONE"; diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java index ec0ef24c095d..b71dc8248a1c 100644 --- a/keystore/java/android/security/keystore/KeyProtection.java +++ b/keystore/java/android/security/keystore/KeyProtection.java @@ -386,7 +386,8 @@ public final class KeyProtection implements ProtectionParameter { * * <p>For RSA private keys used by TLS/SSL servers to authenticate themselves to clients it * is usually necessary to authorize the use of no/any padding - * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}). This is because RSA decryption is + * ({@link KeyProperties#ENCRYPTION_PADDING_NONE}) and/or PKCS#1 encryption padding + * ({@link KeyProperties#ENCRYPTION_PADDING_RSA_PKCS1}). This is because RSA decryption is * required by some cipher suites, and some stacks request decryption using no padding * whereas others request PKCS#1 padding. * diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index a95db9faf72c..62aabb13858d 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -6758,7 +6758,13 @@ void ResTable::print(bool inclValues) const printf(" NON-INTEGER ResTable_type ADDRESS: %p\n", type); continue; } - String8 configStr = type->config.toString(); + + // Always copy the config, as fields get added and we need to + // set the defaults. + ResTable_config thisConfig; + thisConfig.copyFromDtoH(type->config); + + String8 configStr = thisConfig.toString(); printf(" config %s:\n", configStr.size() > 0 ? configStr.string() : "(default)"); size_t entryCount = dtohl(type->entryCount); diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h index 116bc56bfe4d..a0b87f9cadb6 100644 --- a/libs/hwui/Canvas.h +++ b/libs/hwui/Canvas.h @@ -62,6 +62,9 @@ public: virtual int width() = 0; virtual int height() = 0; + virtual void setHighContrastText(bool highContrastText) = 0; + virtual bool isHighContrastText() = 0; + // ---------------------------------------------------------------------------- // Canvas state operations // ---------------------------------------------------------------------------- diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp index af18e03c60a9..cc69d55cbfac 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -437,16 +437,6 @@ void DisplayListCanvas::drawPosText(const uint16_t* text, const float* positions addDrawOp(op); } -static void simplifyPaint(int color, SkPaint* paint) { - paint->setColor(color); - paint->setShader(nullptr); - paint->setColorFilter(nullptr); - paint->setLooper(nullptr); - paint->setStrokeWidth(4 + 0.04 * paint->getTextSize()); - paint->setStrokeJoin(SkPaint::kRound_Join); - paint->setLooper(nullptr); -} - void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, int count, const SkPaint& paint, float x, float y, float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, @@ -459,31 +449,9 @@ void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, positions = refBuffer<float>(positions, count * 2); Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); - if (CC_UNLIKELY(mHighContrastText)) { - // high contrast draw path - int color = paint.getColor(); - int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color); - bool darken = channelSum < (128 * 3); - - // outline - SkPaint* outlinePaint = copyPaint(&paint); - simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, outlinePaint); - outlinePaint->setStyle(SkPaint::kStrokeAndFill_Style); - addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, outlinePaint, totalAdvance, bounds)); // bounds? - - // inner - SkPaint* innerPaint = copyPaint(&paint); - simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, innerPaint); - innerPaint->setStyle(SkPaint::kFill_Style); - addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, innerPaint, totalAdvance, bounds)); - } else { - // standard draw path - DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, - x, y, positions, refPaint(&paint), totalAdvance, bounds); - addDrawOp(op); - } + DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, + x, y, positions, refPaint(&paint), totalAdvance, bounds); + addDrawOp(op); } void DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 6f2e2b50967e..efdf9ed336d9 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -101,10 +101,6 @@ public: // TODO: rename for consistency void callDrawGLFunction(Functor* functor); - void setHighContrastText(bool highContrastText) { - mHighContrastText = highContrastText; - } - // ---------------------------------------------------------------------------- // CanvasStateClient interface // ---------------------------------------------------------------------------- @@ -125,6 +121,11 @@ public: virtual int width() override { return mState.getWidth(); } virtual int height() override { return mState.getHeight(); } + virtual void setHighContrastText(bool highContrastText) override { + mHighContrastText = highContrastText; + } + virtual bool isHighContrastText() override { return mHighContrastText; } + // ---------------------------------------------------------------------------- // android/graphics/Canvas state operations // ---------------------------------------------------------------------------- @@ -304,16 +305,6 @@ private: return cachedPaint; } - inline SkPaint* copyPaint(const SkPaint* paint) { - if (!paint) return nullptr; - - SkPaint* returnPaint = new SkPaint(*paint); - std::unique_ptr<const SkPaint> copy(returnPaint); - mDisplayListData->paints.push_back(std::move(copy)); - - return returnPaint; - } - inline const SkRegion* refRegion(const SkRegion* region) { if (!region) { return region; diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 35051b7cccea..9c2c1192a69d 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -474,7 +474,6 @@ void FontRenderer::issueDrawCommand(Vector<CacheTexture*>& cacheTextures) { if (!mFunctor) return; bool first = true; - bool forceRebind = false; for (uint32_t i = 0; i < cacheTextures.size(); i++) { CacheTexture* texture = cacheTextures[i]; if (texture->canDraw()) { @@ -487,7 +486,6 @@ void FontRenderer::issueDrawCommand(Vector<CacheTexture*>& cacheTextures) { mFunctor->draw(*texture, mLinearFiltering); texture->resetMesh(); - forceRebind = false; } } } diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 26d8bf754ddb..5aef2a568798 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -151,11 +151,8 @@ enum DebugLevel { #define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage" /** - * Setting this property will enable usage of EGL_KHR_swap_buffers_with_damage + * Setting this property will enable or disable usage of EGL_KHR_swap_buffers_with_damage * See: https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_swap_buffers_with_damage.txt - * Default is "false" temporarily - * TODO: Change to "true", make sure to remove the log in EglManager::swapBuffers - * before changing this to default to true! */ #define PROPERTY_SWAP_WITH_DAMAGE "debug.hwui.swap_with_damage" diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 971b53aaf198..c98e2f47001e 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -55,6 +55,9 @@ public: virtual int width() override; virtual int height() override; + virtual void setHighContrastText(bool highContrastText) override {} + virtual bool isHighContrastText() override { return false; } + virtual int getSaveCount() const override; virtual int save(SkCanvas::SaveFlags flags) override; virtual void restore() override; diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp index 4fb5ba41c187..fb0753bbc76c 100644 --- a/libs/hwui/font/Font.cpp +++ b/libs/hwui/font/Font.cpp @@ -19,7 +19,7 @@ #include <utils/JenkinsHash.h> #include <utils/Trace.h> -#include <SkDeviceProperties.h> +#include <SkSurfaceProps.h> #include <SkGlyph.h> #include <SkGlyphCache.h> #include <SkUtils.h> @@ -281,8 +281,8 @@ CachedGlyphInfo* Font::getCachedGlyph(const SkPaint* paint, glyph_t textUnit, bo if (cachedGlyph) { // Is the glyph still in texture cache? if (!cachedGlyph->mIsValid) { - SkDeviceProperties deviceProperties(kUnknown_SkPixelGeometry, 1.0f); - SkAutoGlyphCache autoCache(*paint, &deviceProperties, &mDescription.mLookupTransform); + SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry); + SkAutoGlyphCacheNoGamma autoCache(*paint, &surfaceProps, &mDescription.mLookupTransform); const SkGlyph& skiaGlyph = GET_METRICS(autoCache.getCache(), textUnit); updateGlyphCache(paint, skiaGlyph, autoCache.getCache(), cachedGlyph, precaching); } @@ -472,8 +472,8 @@ CachedGlyphInfo* Font::cacheGlyph(const SkPaint* paint, glyph_t glyph, bool prec CachedGlyphInfo* newGlyph = new CachedGlyphInfo(); mCachedGlyphs.add(glyph, newGlyph); - SkDeviceProperties deviceProperties(kUnknown_SkPixelGeometry, 1.0f); - SkAutoGlyphCache autoCache(*paint, &deviceProperties, &mDescription.mLookupTransform); + SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry); + SkAutoGlyphCacheNoGamma autoCache(*paint, &surfaceProps, &mDescription.mLookupTransform); const SkGlyph& skiaGlyph = GET_METRICS(autoCache.getCache(), glyph); newGlyph->mIsValid = false; newGlyph->mGlyphIndex = skiaGlyph.fID; diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp index a224376c7e77..69e822510c31 100644 --- a/libs/hwui/tests/main.cpp +++ b/libs/hwui/tests/main.cpp @@ -231,14 +231,11 @@ private: renderer->drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode); SkRegion region; - float rects[width * height]; - int index = 0; for (int xOffset = 0; xOffset < width; xOffset+=2) { for (int yOffset = 0; yOffset < height; yOffset+=2) { region.op(xOffset, yOffset, xOffset + 1, yOffset + 1, SkRegion::kUnion_Op); } } - int count = width * height; SkPaint paint; paint.setColor(0xff00ffff); diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java index da33464e7038..f4943d5cea73 100644 --- a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java +++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java @@ -31,8 +31,7 @@ import java.util.HashSet; */ public final class ActivityRecognitionProvider { private final IActivityRecognitionHardware mService; - private final HashSet<Sink> mSinkSet = new HashSet<Sink>(); - private final SinkTransport mSinkTransport = new SinkTransport(); + private final HashSet<Sink> mSinkSet = new HashSet<>(); // the following constants must remain in sync with activity_recognition.h @@ -60,7 +59,7 @@ public final class ActivityRecognitionProvider { throws RemoteException { Preconditions.checkNotNull(service); mService = service; - mService.registerSink(mSinkTransport); + mService.registerSink(new SinkTransport()); } public String[] getSupportedActivities() throws RemoteException { @@ -102,26 +101,23 @@ public final class ActivityRecognitionProvider { private final class SinkTransport extends IActivityRecognitionHardwareSink.Stub { @Override - public void onActivityChanged( - android.hardware.location.ActivityChangedEvent activityChangedEvent) { + public void onActivityChanged(android.hardware.location.ActivityChangedEvent event) { Collection<Sink> sinks; synchronized (mSinkSet) { if (mSinkSet.isEmpty()) { return; } - - sinks = new ArrayList<Sink>(mSinkSet); + sinks = new ArrayList<>(mSinkSet); } // translate the event from platform internal and GmsCore types - ArrayList<ActivityRecognitionEvent> gmsEvents = - new ArrayList<ActivityRecognitionEvent>(); - for (android.hardware.location.ActivityRecognitionEvent event - : activityChangedEvent.getActivityRecognitionEvents()) { + ArrayList<ActivityRecognitionEvent> gmsEvents = new ArrayList<>(); + for (android.hardware.location.ActivityRecognitionEvent reportingEvent + : event.getActivityRecognitionEvents()) { ActivityRecognitionEvent gmsEvent = new ActivityRecognitionEvent( - event.getActivity(), - event.getEventType(), - event.getTimestampNs()); + reportingEvent.getActivity(), + reportingEvent.getEventType(), + reportingEvent.getTimestampNs()); gmsEvents.add(gmsEvent); } ActivityChangedEvent gmsEvent = new ActivityChangedEvent(gmsEvents); diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java new file mode 100644 index 000000000000..0b878d7c1f2b --- /dev/null +++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.location.provider; + +import android.annotation.NonNull; +import android.hardware.location.IActivityRecognitionHardware; +import android.hardware.location.IActivityRecognitionHardwareClient; +import android.os.Binder; +import android.os.IBinder; +import android.os.Process; +import android.os.RemoteException; +import android.util.Log; + +/** + * A client class for interaction with an Activity-Recognition provider. + */ +public abstract class ActivityRecognitionProviderClient { + private static final String TAG = "ArProviderClient"; + + protected ActivityRecognitionProviderClient() {} + + private IActivityRecognitionHardwareClient.Stub mClient = + new IActivityRecognitionHardwareClient.Stub() { + @Override + public void onAvailabilityChanged( + boolean isSupported, + IActivityRecognitionHardware instance) { + int callingUid = Binder.getCallingUid(); + if (callingUid != Process.SYSTEM_UID) { + Log.d(TAG, "Ignoring calls from non-system server. Uid: " + callingUid); + return; + } + ActivityRecognitionProvider provider; + try { + provider = isSupported ? new ActivityRecognitionProvider(instance) : null; + } catch (RemoteException e) { + Log.e(TAG, "Error creating Hardware Activity-Recognition Provider.", e); + return; + } + onProviderChanged(isSupported, provider); + } + }; + + /** + * Gets the binder needed to interact with proxy provider in the platform. + */ + @NonNull + public IBinder getBinder() { + return mClient; + } + + /** + * Called when a change in the availability of {@link ActivityRecognitionProvider} is detected. + * + * @param isSupported whether the platform supports the provider natively + * @param instance the available provider's instance + */ + public abstract void onProviderChanged( + boolean isSupported, + ActivityRecognitionProvider instance); +} diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java index 03dd0426693b..7139025d2722 100644 --- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java +++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java @@ -28,7 +28,10 @@ import android.util.Log; /** * A watcher class for Activity-Recognition instances. + * + * @deprecated use {@link ActivityRecognitionProviderClient} instead. */ +@Deprecated public class ActivityRecognitionProviderWatcher { private static final String TAG = "ActivityRecognitionProviderWatcher"; diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 76d36a09b592..65d04507db67 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -1216,7 +1216,7 @@ public final class MediaCodecInfo { private Range<Double> estimateFrameRatesFor(int width, int height) { Size size = findClosestSize(width, height); Range<Long> range = mMeasuredFrameRates.get(size); - Double ratio = (double)(width * height) / (size.getWidth() * size.getHeight()); + Double ratio = (double)(size.getWidth() * size.getHeight()) / (width * height); return Range.create(range.getLower() * ratio, range.getUpper() * ratio); } diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 338b3f863151..a0e3868c1c9d 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -50,7 +50,8 @@ <activity android:name=".StandaloneActivity" android:theme="@style/StandaloneTheme" - android:icon="@drawable/ic_doc_text" + android:icon="@drawable/ic_files_app" + android:label="@string/files_label" android:enabled="@bool/productivity_device"> <intent-filter> <action android:name="android.intent.action.MAIN" /> diff --git a/packages/DocumentsUI/res/drawable/ic_files_app.xml b/packages/DocumentsUI/res/drawable/ic_files_app.xml new file mode 100644 index 000000000000..ff7189e94e8b --- /dev/null +++ b/packages/DocumentsUI/res/drawable/ic_files_app.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<bitmap xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/icon256" + android:tint="?android:attr/colorControlNormal" + android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/icon256.png b/packages/DocumentsUI/res/drawable/icon256.png Binary files differnew file mode 100644 index 000000000000..631c95144f60 --- /dev/null +++ b/packages/DocumentsUI/res/drawable/icon256.png diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index 5995f081e42d..4c3176618ff1 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Maak oop vanuit"</string> <string name="title_save" msgid="2433679664882857999">"Stoor na"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Skep vouer"</string> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml index f264e2feade4..a17b22b14472 100644 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ b/packages/DocumentsUI/res/values-am/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ሰነዶች"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"ክፈት ከ"</string> <string name="title_save" msgid="2433679664882857999">"አስቀምጥ ወደ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"አቃፊ ፍጠር"</string> diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml index a17fb2adc66e..230a9b844260 100644 --- a/packages/DocumentsUI/res/values-ar/strings.xml +++ b/packages/DocumentsUI/res/values-ar/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"مستندات"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"فتح من"</string> <string name="title_save" msgid="2433679664882857999">"حفظ في"</string> <string name="menu_create_dir" msgid="5947289605844398389">"إنشاء مجلد"</string> diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml index a54fb9f7db01..1e3196148b05 100644 --- a/packages/DocumentsUI/res/values-az-rAZ/strings.xml +++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Sənədlər"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Vasitəsilə açın"</string> <string name="title_save" msgid="2433679664882857999">"buraya saxlayın"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Qovluq yaradın"</string> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index b130bc7675c0..8127f6cfdda5 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Отваряне от"</string> <string name="title_save" msgid="2433679664882857999">"Запазване във:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Създаване на папка"</string> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml index 13e3a5cf158a..97dd5c4e164d 100644 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"দস্তাবেজগুলি"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"এখান থেকে খুলুন"</string> <string name="title_save" msgid="2433679664882857999">"এতে সংরক্ষণ করুন"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ফোল্ডার তৈরি করুন"</string> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index 407e34599641..fb4060b52419 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Obre des de"</string> <string name="title_save" msgid="2433679664882857999">"Desa a"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Crea una carpeta"</string> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index e56ddfc44eef..033bbb0b2bbe 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Otevřít"</string> <string name="title_save" msgid="2433679664882857999">"Uložit do"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Vytvořit složku"</string> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index c22c453b8cc7..890224c4c372 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Åbn fra"</string> <string name="title_save" msgid="2433679664882857999">"Gem i"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Opret mappe"</string> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index f9141694872a..1f194c58d078 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> + <string name="files_label" msgid="6051402950202690279">"Dateien"</string> <string name="title_open" msgid="4353228937663917801">"Öffnen von"</string> <string name="title_save" msgid="2433679664882857999">"Speichern unter"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Ordner erstellen"</string> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index b58860ec4821..62b5990e530b 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Έγγραφα"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Άνοιγμα από"</string> <string name="title_save" msgid="2433679664882857999">"Αποθήκευση σε"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Δημιουργία φακέλου"</string> diff --git a/packages/DocumentsUI/res/values-en-rAU/strings.xml b/packages/DocumentsUI/res/values-en-rAU/strings.xml index 2793eaa89146..b56642f4ee2d 100644 --- a/packages/DocumentsUI/res/values-en-rAU/strings.xml +++ b/packages/DocumentsUI/res/values-en-rAU/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> + <string name="files_label" msgid="6051402950202690279">"Files"</string> <string name="title_open" msgid="4353228937663917801">"Open from"</string> <string name="title_save" msgid="2433679664882857999">"Save to"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Create folder"</string> diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml index 2793eaa89146..b56642f4ee2d 100644 --- a/packages/DocumentsUI/res/values-en-rGB/strings.xml +++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> + <string name="files_label" msgid="6051402950202690279">"Files"</string> <string name="title_open" msgid="4353228937663917801">"Open from"</string> <string name="title_save" msgid="2433679664882857999">"Save to"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Create folder"</string> diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml index 2793eaa89146..b56642f4ee2d 100644 --- a/packages/DocumentsUI/res/values-en-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> + <string name="files_label" msgid="6051402950202690279">"Files"</string> <string name="title_open" msgid="4353228937663917801">"Open from"</string> <string name="title_save" msgid="2433679664882857999">"Save to"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Create folder"</string> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index c0422027a732..7ddb9f27fe6b 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> <string name="title_save" msgid="2433679664882857999">"Guardar en"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Crear carpeta"</string> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 31de502ec954..1f985ea75fb1 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <string name="files_label" msgid="6051402950202690279">"Archivos"</string> <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> <string name="title_save" msgid="2433679664882857999">"Guardar en"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Crear carpeta"</string> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index 19deff81006f..de92348d50c6 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumendid"</string> + <string name="files_label" msgid="6051402950202690279">"Failid"</string> <string name="title_open" msgid="4353228937663917801">"Ava:"</string> <string name="title_save" msgid="2433679664882857999">"Salvesta:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Loo kaust"</string> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index e2a7cc914cee..5bab0b79d783 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumentuak"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Ireki hemendik"</string> <string name="title_save" msgid="2433679664882857999">"Gorde hemen"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Sortu karpeta"</string> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index 56363b20de48..0df4da3c9084 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"اسناد"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"باز کردن از"</string> <string name="title_save" msgid="2433679664882857999">"ذخیره در"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ایجاد پوشه"</string> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index 8a3c66ce0c07..1fce7642a7e1 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Asiakirjat"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Avaa sijainnista"</string> <string name="title_save" msgid="2433679664882857999">"Tallenna kohteeseen"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Luo kansio"</string> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 4cd4f9da24df..146e2452bffa 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> <string name="title_save" msgid="2433679664882857999">"Enregistrer dans"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index ba621024ceb2..a96610ca7826 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Docs"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index 3dd533cdfce4..fbd9dcf9a16e 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> <string name="title_save" msgid="2433679664882857999">"Gardar en"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Crear cartafol"</string> diff --git a/packages/DocumentsUI/res/values-gu-rIN/strings.xml b/packages/DocumentsUI/res/values-gu-rIN/strings.xml index 330100607191..ccc41b68c7a7 100644 --- a/packages/DocumentsUI/res/values-gu-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-gu-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"દસ્તાવેજો"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"અહીંથી ખોલો"</string> <string name="title_save" msgid="2433679664882857999">"આમાં સાચવો"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ફોલ્ડર બનાવો"</string> diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml index 367b329ca135..38d2f8ebc672 100644 --- a/packages/DocumentsUI/res/values-hi/strings.xml +++ b/packages/DocumentsUI/res/values-hi/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"दस्तावेज़"</string> + <string name="files_label" msgid="6051402950202690279">"फ़ाइलें"</string> <string name="title_open" msgid="4353228937663917801">"यहां से खोलें"</string> <string name="title_save" msgid="2433679664882857999">"यहां सहेजें"</string> <string name="menu_create_dir" msgid="5947289605844398389">"फ़ोल्डर बनाएं"</string> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml index 971fc620dee2..eb2f855ed64f 100644 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ b/packages/DocumentsUI/res/values-hr/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Otvori iz"</string> <string name="title_save" msgid="2433679664882857999">"Spremi u"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Izradi mapu"</string> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml index 7a6cf5be5f24..865d55e3da69 100644 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ b/packages/DocumentsUI/res/values-hu/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumentumok"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Megnyitás innen"</string> <string name="title_save" msgid="2433679664882857999">"Mentés ide"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Mappa létrehozása"</string> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index f27f496b3cca..62c627b8e060 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Փաստաթղթեր"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Բացել այստեղից"</string> <string name="title_save" msgid="2433679664882857999">"Պահել այստեղ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Ստեղծել պանակ"</string> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index 693c1c773704..581d8ab17682 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumen"</string> + <string name="files_label" msgid="6051402950202690279">"File"</string> <string name="title_open" msgid="4353228937663917801">"Buka dari"</string> <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Buat folder"</string> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index 0b3d83d5d3bc..d7fae4e961ba 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Skjöl"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Opna frá"</string> <string name="title_save" msgid="2433679664882857999">"Vista í"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Búa til möppu"</string> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml index 94fe6d160d73..fe16e636436d 100644 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ b/packages/DocumentsUI/res/values-it/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documenti"</string> + <string name="files_label" msgid="6051402950202690279">"File"</string> <string name="title_open" msgid="4353228937663917801">"Apri da"</string> <string name="title_save" msgid="2433679664882857999">"Salva in"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Crea cartella"</string> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index ab583596ab92..38c2501a3d40 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"מסמכים"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"פתח מ-"</string> <string name="title_save" msgid="2433679664882857999">"שמור ב-"</string> <string name="menu_create_dir" msgid="5947289605844398389">"צור תיקיה"</string> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index c6d3765119c2..0c9cb6ff8c2a 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ドキュメント"</string> + <string name="files_label" msgid="6051402950202690279">"ファイル"</string> <string name="title_open" msgid="4353228937663917801">"次から開く:"</string> <string name="title_save" msgid="2433679664882857999">"次に保存:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"フォルダを作成"</string> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 78c8744ff449..8fb812deac28 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"დოკუმენტები"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"გახსნა აქედან:"</string> <string name="title_save" msgid="2433679664882857999">"შენახვა აქ:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"საქაღალდის შექმნა"</string> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index 860d57406c07..7651735dded1 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Құжаттар"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Мынадан ашу:"</string> <string name="title_save" msgid="2433679664882857999">"Сақталатын орны"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Қалта жасақтау"</string> diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml index 4be93b4eea07..bec2980cef29 100644 --- a/packages/DocumentsUI/res/values-km-rKH/strings.xml +++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ឯកសារ"</string> + <string name="files_label" msgid="6051402950202690279">"ឯកសារ"</string> <string name="title_open" msgid="4353228937663917801">"បើកពី"</string> <string name="title_save" msgid="2433679664882857999">"រក្សាទុកទៅ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"បង្កើតថត"</string> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml index ca4f2d4c13bb..f4f13d28e033 100644 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ಡಾಕ್ಯುಮೆಂಟ್ಗಳು"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string> <string name="title_save" msgid="2433679664882857999">"ಇವುಗಳಲ್ಲಿ ಉಳಿಸಿ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ಫೋಲ್ಡರ್ ರಚಿಸು"</string> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index b6ffd0d4b93f..0afb8559cd3c 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"문서"</string> + <string name="files_label" msgid="6051402950202690279">"파일"</string> <string name="title_open" msgid="4353228937663917801">"열기:"</string> <string name="title_save" msgid="2433679664882857999">"저장 위치:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"폴더 만들기"</string> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index 9885f3711954..7eb10d46e7f2 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документтер"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Кийинкиден ачуу:"</string> <string name="title_save" msgid="2433679664882857999">"Кийинкиге сактоо:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Папка түзүү"</string> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index 4240ba367c2f..21aae6bb5069 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ເອກະສານ"</string> + <string name="files_label" msgid="6051402950202690279">"ໄຟລ໌"</string> <string name="title_open" msgid="4353228937663917801">"ເປີດຈາກ"</string> <string name="title_save" msgid="2433679664882857999">"ບັນທຶກໄປທີ່"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ສ້າງໂຟນເດີ"</string> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index cdeb8ac1127c..938aaee79c21 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumentai"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Atidaryti iš"</string> <string name="title_save" msgid="2433679664882857999">"Išsaugoti į"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Kurti aplanką"</string> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 1a9d0c8d3698..54917f7916fd 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Atvēršana no:"</string> <string name="title_save" msgid="2433679664882857999">"Saglabāšana:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Izveidot mapi"</string> diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml index 241d2c504c76..39b9a682fab8 100644 --- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml +++ b/packages/DocumentsUI/res/values-mk-rMK/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Отвори од"</string> <string name="title_save" msgid="2433679664882857999">"Зачувај во"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Создади папка"</string> diff --git a/packages/DocumentsUI/res/values-ml-rIN/strings.xml b/packages/DocumentsUI/res/values-ml-rIN/strings.xml index 1261ac346f75..7f165da5cab5 100644 --- a/packages/DocumentsUI/res/values-ml-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ml-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"പ്രമാണങ്ങൾ"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"ഇതിൽ നിന്നും തുറക്കുക"</string> <string name="title_save" msgid="2433679664882857999">"ഇതില് സംരക്ഷിക്കുക"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ഫോൾഡർ സൃഷ്ടിക്കുക"</string> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index 512573c75be6..92769640791f 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документүүд"</string> + <string name="files_label" msgid="6051402950202690279">"Файл"</string> <string name="title_open" msgid="4353228937663917801">"Нээх"</string> <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Фолдер үүсгэх"</string> diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml index 9bf259074c36..7906fbd63024 100644 --- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-mr-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"दस्तऐवज"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"वरून उघडा"</string> <string name="title_save" msgid="2433679664882857999">"येथे जतन करा"</string> <string name="menu_create_dir" msgid="5947289605844398389">"फोल्डर तयार करा"</string> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index 5c99c74c75b0..be12361cc4bb 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumen"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Buka dari"</string> <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Buat folder"</string> diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml index 81b46db85b7d..8efbfa0c1bc7 100644 --- a/packages/DocumentsUI/res/values-my-rMM/strings.xml +++ b/packages/DocumentsUI/res/values-my-rMM/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"စာရွက်စာတန်းများ"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"မှ ဖွင့်ပါ"</string> <string name="title_save" msgid="2433679664882857999">"သို့ သိမ်းပါ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"အကန့် တည်ဆောက်ရန်"</string> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index ab9551838fbf..622345f68cde 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Åpne fra"</string> <string name="title_save" msgid="2433679664882857999">"Lagre i"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Opprett en mappe"</string> diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml index 4d597f36c32b..8a73bad318f2 100644 --- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml +++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"कागजातहरू"</string> + <string name="files_label" msgid="6051402950202690279">"फाइलहरू"</string> <string name="title_open" msgid="4353228937663917801">"यसबाट खोल्नुहोस्"</string> <string name="title_save" msgid="2433679664882857999">"यसमा सुरक्षित गर्नुहोस्"</string> <string name="menu_create_dir" msgid="5947289605844398389">"फोल्डर सिर्जना गर्नुहोस्"</string> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index 2a77ad3d5c1b..3f9001442bda 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documenten"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Openen vanuit"</string> <string name="title_save" msgid="2433679664882857999">"Opslaan in"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Map maken"</string> diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml index 3a064e06703b..47c8042d915a 100644 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-pa-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ਦਸਤਾਵੇਜ਼"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"ਤੋਂ ਖੋਲ੍ਹੋ"</string> <string name="title_save" msgid="2433679664882857999">"ਇਸ ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਕਰੋ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ਫੋਲਡਰ ਬਣਾਓ"</string> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 9460fe86eab6..842939987caf 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Otwórz z"</string> <string name="title_save" msgid="2433679664882857999">"Zapisz w"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Utwórz folder"</string> diff --git a/packages/DocumentsUI/res/values-pt-rBR/strings.xml b/packages/DocumentsUI/res/values-pt-rBR/strings.xml index a361bc7c61c2..2c1ec0cbb189 100644 --- a/packages/DocumentsUI/res/values-pt-rBR/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rBR/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> <string name="title_save" msgid="2433679664882857999">"Salvar em"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Criar pasta"</string> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index 766cd689b0ea..40d82a7645ae 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> <string name="title_save" msgid="2433679664882857999">"Guardar em"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Criar pasta"</string> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index a361bc7c61c2..2c1ec0cbb189 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documentos"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> <string name="title_save" msgid="2433679664882857999">"Salvar em"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Criar pasta"</string> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index 8719645787a4..67d2e4358d47 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documente"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Deschideți din"</string> <string name="title_save" msgid="2433679664882857999">"Salvați în"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Creați un dosar"</string> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 83fb3ae6647f..35ca7411a5c2 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документы"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Открыть"</string> <string name="title_save" msgid="2433679664882857999">"Сохранить"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Новая папка"</string> diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml index 7000cc2d57ea..7eec222fd6ed 100644 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ලේඛන"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"විවෘත වන්නේ"</string> <string name="title_save" msgid="2433679664882857999">"සුරකින්නේ"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ෆෝල්ඩරයක් සාදන්න"</string> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index 3a012fa457ee..4c1f18f625e2 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenty"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Otvoriť z"</string> <string name="title_save" msgid="2433679664882857999">"Uložiť do"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Vytvoriť priečinok"</string> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml index be3913efa81c..235bb35abdb1 100644 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ b/packages/DocumentsUI/res/values-sl/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumenti"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Odpri iz mape"</string> <string name="title_save" msgid="2433679664882857999">"Shrani v"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Ustvarjanje mape"</string> diff --git a/packages/DocumentsUI/res/values-sq-rAL/strings.xml b/packages/DocumentsUI/res/values-sq-rAL/strings.xml index 6f0971622d68..8d63f6d66ee1 100644 --- a/packages/DocumentsUI/res/values-sq-rAL/strings.xml +++ b/packages/DocumentsUI/res/values-sq-rAL/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokumente"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Hap nga"</string> <string name="title_save" msgid="2433679664882857999">"Ruaje te"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Krijo dosje"</string> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 49c70119bd2b..23297e9d3eb8 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Отвори са"</string> <string name="title_save" msgid="2433679664882857999">"Сачувај у"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Направи директоријум"</string> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index 83adc9eb6b2b..f3d2eafe9e6c 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokument"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Öppna från"</string> <string name="title_save" msgid="2433679664882857999">"Spara till"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Skapa mapp"</string> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index 23d82b8b576f..05f5c9d8524f 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Hati"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Fungua kutoka"</string> <string name="title_save" msgid="2433679664882857999">"Hifadhi kwenye"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Unda folda"</string> diff --git a/packages/DocumentsUI/res/values-sw720dp/dimens.xml b/packages/DocumentsUI/res/values-sw720dp/dimens.xml index 46c110ce2320..f393d88a82cd 100644 --- a/packages/DocumentsUI/res/values-sw720dp/dimens.xml +++ b/packages/DocumentsUI/res/values-sw720dp/dimens.xml @@ -19,7 +19,7 @@ <item type="dimen" name="dialog_width">85%</item> - <dimen name="grid_padding_horiz">24dp</dimen> + <dimen name="grid_padding_horiz">16dp</dimen> <dimen name="grid_padding_vert">16dp</dimen> <dimen name="grid_item_margin">8dp</dimen> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml index 05cbeb9f406a..828fdd36ecb4 100644 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"ஆவணங்கள்"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"இதில் திற"</string> <string name="title_save" msgid="2433679664882857999">"இதில் சேமி"</string> <string name="menu_create_dir" msgid="5947289605844398389">"கோப்புறையை உருவாக்கு"</string> diff --git a/packages/DocumentsUI/res/values-te-rIN/strings.xml b/packages/DocumentsUI/res/values-te-rIN/strings.xml index ca949632ec1a..1ce32d8258c9 100644 --- a/packages/DocumentsUI/res/values-te-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-te-rIN/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"పత్రాలు"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"ఇక్కడి నుండి తెరువు"</string> <string name="title_save" msgid="2433679664882857999">"ఇందులో సేవ్ చేయి"</string> <string name="menu_create_dir" msgid="5947289605844398389">"ఫోల్డర్ను సృష్టించు"</string> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index 4e4d1b20f066..f6e96f7692c0 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"เอกสาร"</string> + <string name="files_label" msgid="6051402950202690279">"ไฟล์"</string> <string name="title_open" msgid="4353228937663917801">"เปิดจาก"</string> <string name="title_save" msgid="2433679664882857999">"บันทึกไปยัง"</string> <string name="menu_create_dir" msgid="5947289605844398389">"สร้างโฟลเดอร์"</string> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index 22892d9d2f46..6da7eb920422 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Mga Dokumento"</string> + <string name="files_label" msgid="6051402950202690279">"Mga File"</string> <string name="title_open" msgid="4353228937663917801">"Buksan mula sa"</string> <string name="title_save" msgid="2433679664882857999">"I-save sa"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Gumawa ng folder"</string> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index cf73ee06ec08..41706c2b07f9 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Dokümanlar"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Şuradan aç:"</string> <string name="title_save" msgid="2433679664882857999">"Şuraya kaydet:"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Klasör oluştur"</string> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index 533c124f4ad2..afc0309cf5af 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Документи"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Відкрити"</string> <string name="title_save" msgid="2433679664882857999">"Зберегти в"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Створити папку"</string> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index d2f7db399607..6f3dd2f292fb 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"دستاویزات"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"کھولیں از"</string> <string name="title_save" msgid="2433679664882857999">"اس میں محفوظ کریں"</string> <string name="menu_create_dir" msgid="5947289605844398389">"فولڈر بنائیں"</string> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 0ca6caae156f..54adf972b9dc 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Hujjatlar"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Ochish"</string> <string name="title_save" msgid="2433679664882857999">"Saqlash"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Jild yaratish"</string> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml index 2ce788794282..d8c7d4206f45 100644 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ b/packages/DocumentsUI/res/values-vi/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Tài liệu"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"Mở từ"</string> <string name="title_save" msgid="2433679664882857999">"Lưu vào"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Tạo thư mục"</string> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 2385b856411f..fbd11adbb4ac 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文档"</string> + <string name="files_label" msgid="6051402950202690279">"文件"</string> <string name="title_open" msgid="4353228937663917801">"打开文件"</string> <string name="title_save" msgid="2433679664882857999">"保存文件"</string> <string name="menu_create_dir" msgid="5947289605844398389">"新建文件夹"</string> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index c8054966f95f..8a888bfefc7c 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文件"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> <string name="title_save" msgid="2433679664882857999">"儲存至"</string> <string name="menu_create_dir" msgid="5947289605844398389">"建立資料夾"</string> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index bbc58b14b960..07c308ce2c3c 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -17,6 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"文件"</string> + <!-- no translation found for files_label (6051402950202690279) --> + <skip /> <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> <string name="title_save" msgid="2433679664882857999">"儲存至"</string> <string name="menu_create_dir" msgid="5947289605844398389">"建立資料夾"</string> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index aeaf7a408afd..3f09790a2ed0 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -17,6 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Amadokhumenti"</string> + <string name="files_label" msgid="6051402950202690279">"Amafayela"</string> <string name="title_open" msgid="4353228937663917801">"Vula kusuka ku-"</string> <string name="title_save" msgid="2433679664882857999">"Londoloza ku-"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Dala ifolda"</string> diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml index fd0518b260a9..c6f428a336d6 100644 --- a/packages/DocumentsUI/res/values/colors.xml +++ b/packages/DocumentsUI/res/values/colors.xml @@ -17,8 +17,14 @@ <resources> <color name="material_grey_50">#fffafafa</color> <color name="material_grey_300">#ffeeeeee</color> + <color name="material_grey_600">#ff757575</color> + <color name="material_grey_800">#ff424242</color> + <color name="material_blue_700">#ff1976d2</color> + <color name="material_blue_500">#ff2196f3</color> <color name="directory_background">@color/material_grey_300</color> <color name="item_doc_grid_background">#FFFFFFFF</color> <color name="item_doc_grid_protect_background">#88000000</color> + <color name="status_bar_background">@color/material_blue_700</color> + <color name="action_mode_status_bar_background">@color/material_grey_800</color> </resources> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index b970f68d5c0b..616f4dd9492c 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -18,6 +18,9 @@ <!-- Title of the documents application [CHAR LIMIT=32] --> <string name="app_label">Documents</string> + <!-- Title of the standalone files activity. [CHAR LIMIT=32] --> + <string name="files_label">Files</string> + <!-- Action bar title prompting user to choose a location to open a document from [CHAR LIMIT=32] --> <string name="title_open">Open from</string> <!-- Action bar title prompting user to choose a location to save a document to [CHAR LIMIT=32] --> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml index a9e7ac7a8869..a1ad7e4616bc 100644 --- a/packages/DocumentsUI/res/values/styles.xml +++ b/packages/DocumentsUI/res/values/styles.xml @@ -54,12 +54,17 @@ <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item> </style> + <style name="ActionModeStyle" parent="@android:style/Widget.Material.Light.ActionMode"> + <item name="android:background">@color/material_grey_600</item> + </style> + <style name="StandaloneTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar"> <item name="android:actionBarWidgetTheme">@null</item> - <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item> - <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item> - <item name="android:colorAccent">@*android:color/material_deep_teal_500</item> + <item name="android:colorPrimaryDark">@color/status_bar_background</item> + <item name="android:colorPrimary">@color/material_blue_500</item> + <item name="android:colorAccent">@color/material_blue_700</item> + <item name="android:actionModeStyle">@style/ActionModeStyle</item> <item name="android:listDivider">@*android:drawable/list_divider_material</item> diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 848ab93526c2..4cd38711dbb6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -605,6 +605,8 @@ public class DirectoryFragment extends Fragment { if (mActionMode == null) { if (DEBUG) Log.d(TAG, "Yeah. Starting action mode."); mActionMode = getActivity().startActionMode(this); + getActivity().getWindow().setStatusBarColor( + getResources().getColor(R.color.action_mode_status_bar_background)); } updateActionMenu(); } else { @@ -612,6 +614,8 @@ public class DirectoryFragment extends Fragment { if (mActionMode != null) { mActionMode.finish(); } + getActivity().getWindow().setStatusBarColor( + getResources().getColor(R.color.status_bar_background)); } if (mActionMode != null) { @@ -1440,8 +1444,10 @@ public class DirectoryFragment extends Fragment { } void selectAllFiles() { - mSelectionManager.selectItems(0, mAdapter.getItemCount()); - updateDisplayState(); + boolean changed = mSelectionManager.setItemsSelected(0, mAdapter.getItemCount(), true); + if (changed) { + updateDisplayState(); + } } private void setupDragAndDropOnDirectoryView(View view) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java index 73def2df74fe..a725dfd04438 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java +++ b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java @@ -16,6 +16,9 @@ package com.android.documentsui; +import static com.android.internal.util.Preconditions.checkNotNull; +import static com.android.internal.util.Preconditions.checkState; + import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.AdapterDataObserver; @@ -94,13 +97,16 @@ public final class MultiSelectManager { }); } + /** + * Constructs a new instance with {@code adapter} and {@code helper}. + * @param adapter + * @param helper + * @hide + */ + @VisibleForTesting MultiSelectManager(Adapter<?> adapter, RecyclerViewHelper helper) { - if (adapter == null) { - throw new IllegalArgumentException("Adapter cannot be null."); - } - if (helper == null) { - throw new IllegalArgumentException("Helper cannot be null."); - } + checkNotNull(adapter, "'adapter' cannot be null."); + checkNotNull(helper, "'helper' cannot be null."); mHelper = helper; mAdapter = adapter; @@ -136,6 +142,12 @@ public final class MultiSelectManager { }); } + /** + * Adds {@code callback} such that it will be notified when {@code MultiSelectManager} + * events occur. + * + * @param callback + */ public void addCallback(MultiSelectManager.Callback callback) { mCallbacks.add(callback); } @@ -165,18 +177,45 @@ public final class MultiSelectManager { return dest; } - public void selectItem(int position) { - selectItems(position, 1); + /** + * Causes item at {@code position} in adapter to be selected. + * + * @param position Adapter position + * @param selected + * @return True if the selection state of the item changed. + */ + public boolean setItemSelected(int position, boolean selected) { + boolean changed = (selected) + ? mSelection.add(position) + : mSelection.remove(position); + + if (changed) { + notifyItemStateChanged(position, true); + } + return changed; } - public void selectItems(int position, int length) { + /** + * @param position + * @param length + * @param selected + * @return True if the selection state of any of the items changed. + */ + public boolean setItemsSelected(int position, int length, boolean selected) { + boolean changed = false; for (int i = position; i < position + length; i++) { - mSelection.add(i); + changed |= setItemSelected(i, selected); } + return changed; } + /** + * Clears the selection. + */ public void clearSelection() { - if (DEBUG) Log.d(TAG, "Clearing selection"); + if (mSelection.isEmpty()) { + return; + } if (mIntermediateSelection == null) { mIntermediateSelection = new Selection(); } @@ -185,14 +224,17 @@ public final class MultiSelectManager { for (int i = 0; i < mIntermediateSelection.size(); i++) { int position = mIntermediateSelection.get(i); - mAdapter.notifyItemChanged(position); notifyItemStateChanged(position, false); } } - public boolean onSingleTapUp(MotionEvent e) { + /** + * @param e + * @return true if the event was consumed. + */ + private boolean onSingleTapUp(MotionEvent e) { if (DEBUG) Log.d(TAG, "Handling tap event."); - if (mSelection.size() == 0) { + if (mSelection.isEmpty()) { return false; } @@ -200,25 +242,30 @@ public final class MultiSelectManager { } /** + * TODO: Roll this into {@link #onSingleTapUp(MotionEvent)} once MotionEvent + * can be mocked. + * * @param position + * @return true if the event was consumed. * @hide */ @VisibleForTesting boolean onSingleTapUp(int position) { - if (mSelection.size() == 0) { + if (mSelection.isEmpty()) { return false; } if (position == RecyclerView.NO_POSITION) { - if (DEBUG) Log.i(TAG, "View is null. Cannot handle tap event."); - return false; + if (DEBUG) Log.d(TAG, "View is null. Canceling selection."); + clearSelection(); + return true; } toggleSelection(position); return true; } - public void onLongPress(MotionEvent e) { + private void onLongPress(MotionEvent e) { if (DEBUG) Log.d(TAG, "Handling long press event."); int position = mHelper.findEventPosition(e); @@ -230,6 +277,9 @@ public final class MultiSelectManager { } /** + * TODO: Roll this back into {@link #onLongPress(MotionEvent)} once MotionEvent + * can be mocked. + * * @param position * @hide */ @@ -255,7 +305,6 @@ public final class MultiSelectManager { if (notifyBeforeItemStateChange(position, nextState)) { boolean selected = mSelection.flip(position); notifyItemStateChanged(position, selected); - mAdapter.notifyItemChanged(position); if (DEBUG) Log.d(TAG, "Selection after long press: " + mSelection); } else { Log.i(TAG, "Selection change cancelled by listener."); @@ -283,13 +332,13 @@ public final class MultiSelectManager { for (int i = lastListener; i > -1; i--) { mCallbacks.get(i).onItemStateChanged(position, selected); } + mAdapter.notifyItemChanged(position); } /** - * Object representing the current selection. + * Object representing the current selection. Provides read only access + * public access, and private write access. */ - // NOTE: Much of the code in this class was copious swiped from - // ArrayUtils, GrowingArrayUtils, and SparseBooleanArray. public static final class Selection { private SparseBooleanArray mSelection; @@ -327,6 +376,13 @@ public final class MultiSelectManager { return mSelection.size(); } + /** + * @return true if the selection is empty. + */ + public boolean isEmpty() { + return mSelection.size() == 0; + } + private boolean flip(int position) { if (contains(position)) { remove(position); @@ -339,14 +395,22 @@ public final class MultiSelectManager { /** @hide */ @VisibleForTesting - void add(int position) { - mSelection.put(position, true); + boolean add(int position) { + if (!mSelection.get(position)) { + mSelection.put(position, true); + return true; + } + return false; } /** @hide */ @VisibleForTesting - void remove(int position) { - mSelection.delete(position); + boolean remove(int position) { + if (mSelection.get(position)) { + mSelection.delete(position); + return true; + } + return false; } /** @@ -360,12 +424,8 @@ public final class MultiSelectManager { */ @VisibleForTesting void expand(int startPosition, int count) { - if (startPosition < 0) { - throw new IllegalArgumentException("startPosition must be non-negative"); - } - if (count < 1) { - throw new IllegalArgumentException("countMust be greater than 0"); - } + checkState(startPosition >= 0); + checkState(count > 0); for (int i = 0; i < mSelection.size(); i++) { int itemPosition = mSelection.keyAt(i); @@ -386,12 +446,8 @@ public final class MultiSelectManager { */ @VisibleForTesting void collapse(int startPosition, int count) { - if (startPosition < 0) { - throw new IllegalArgumentException("startPosition must be non-negative"); - } - if (count < 1) { - throw new IllegalArgumentException("countMust be greater than 0"); - } + checkState(startPosition >= 0); + checkState(count > 0); int endPosition = startPosition + count - 1; @@ -481,7 +537,7 @@ public final class MultiSelectManager { /** * A composite {@code OnGestureDetector} that allows us to delegate unhandled - * events to other interested parties. + * events to an outside party (presumably DirectoryFragment). */ private static final class CompositeOnGestureListener implements OnGestureListener { diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java index 57677d31ac40..20fb07eaedf5 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManagerTest.java @@ -64,33 +64,41 @@ public class MultiSelectManagerTest { } @Test - public void singleTapDoesNotSelectBeforeLongPress() { - mManager.onSingleTapUp(99); - assertSelection(); - } - - @Test - public void longPressStartsSelectionMode() { + public void longPress_StartsSelectionMode() { mManager.onLongPress(7); assertSelection(7); } @Test - public void secondLongPressExtendsSelection() { + public void longPress_SecondPressExtendsSelection() { mManager.onLongPress(7); mManager.onLongPress(99); assertSelection(7, 99); } @Test - public void singleTapUnselectedLastItem() { + public void singleTapUp_DoesNotSelectBeforeLongPress() { + mManager.onSingleTapUp(99); + assertSelection(); + } + + @Test + public void singleTapUp_UnselectsSelectedItem() { mManager.onLongPress(7); mManager.onSingleTapUp(7); assertSelection(); } @Test - public void singleTapUpExtendsSelection() { + public void singleTapUp_NoPositionClearsSelection() { + mManager.onLongPress(7); + mManager.onSingleTapUp(11); + mManager.onSingleTapUp(RecyclerView.NO_POSITION); + assertSelection(); + } + + @Test + public void singleTapUp_ExtendsSelection() { mManager.onLongPress(99); mManager.onSingleTapUp(7); mManager.onSingleTapUp(13); diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManager_SelectionTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManager_SelectionTest.java index 58f2e096ea10..51b542b2ae8c 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManager_SelectionTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/MultiSelectManager_SelectionTest.java @@ -59,6 +59,13 @@ public class MultiSelectManager_SelectionTest { } @Test + public void isEmpty() { + assertTrue(new Selection().isEmpty()); + selection.clear(); + assertTrue(selection.isEmpty()); + } + + @Test public void sizeAndGet() { Selection other = new Selection(); for (int i = 0; i < selection.size(); i++) { diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml index c07bdb2d9e75..d4bb025ee90b 100644 --- a/packages/Keyguard/res/values-ro/strings.xml +++ b/packages/Keyguard/res/values-ro/strings.xml @@ -70,7 +70,7 @@ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"Cardul SIM este acum dezactivat. Introduceţi codul PUK pentru a continua. Contactaţi operatorul pentru mai multe detalii."</string> <string name="kg_puk_enter_puk_hint_multi" msgid="363822494559783025">"Cardul SIM „<xliff:g id="CARRIER">%1$s</xliff:g>” este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul."</string> <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Introduceţi codul PIN dorit"</string> - <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmaţi codul PIN dorit"</string> + <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmați codul PIN dorit"</string> <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"Se deblochează cardul SIM..."</string> <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"Introduceţi un cod PIN format din 4 până la 8 cifre."</string> <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"Codul PUK trebuie să aibă minimum 8 cifre."</string> diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java index e89caf776955..159ac4cc6cbd 100644 --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -23,7 +23,6 @@ import java.util.Objects; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Resources; import android.content.res.TypedArray; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; @@ -59,11 +58,11 @@ public class CarrierText extends TextView { updateCarrierText(); } - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setSelected(false); }; - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setSelected(true); }; }; @@ -193,8 +192,8 @@ public class CarrierText extends TextView { super.onFinishInflate(); mSeparator = getResources().getString( com.android.internal.R.string.kg_text_message_separator); - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setSelected(screenOn); // Allow marquee to work. + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setSelected(shouldMarquee); // Allow marquee to work. } @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java index 301b171c2fe5..2951af915ff8 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java @@ -58,10 +58,10 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay { }; private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setSelected(false); }; - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setSelected(true); }; }; @@ -126,8 +126,8 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay { @Override protected void onFinishInflate() { - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setSelected(screenOn); // This is required to ensure marquee works + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setSelected(shouldMarquee); // This is required to ensure marquee works } private void securityMessageChanged(CharSequence message) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java index d265e0dc8b81..4abb795b267b 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java @@ -16,8 +16,12 @@ package com.android.keyguard; +import android.animation.Animator; +import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; +import android.view.RenderNode; +import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -114,10 +118,8 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { enableClipping(false); setAlpha(1f); setTranslationY(mAppearAnimationUtils.getStartTranslation()); - animate() - .setDuration(500) - .setInterpolator(mAppearAnimationUtils.getInterpolator()) - .translationY(0); + AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */, + 0, mAppearAnimationUtils.getInterpolator()); mAppearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override @@ -131,10 +133,8 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { public boolean startDisappearAnimation(final Runnable finishRunnable) { enableClipping(false); setTranslationY(0); - animate() - .setDuration(280) - .setInterpolator(mDisappearAnimationUtils.getInterpolator()) - .translationY(mDisappearYTranslation); + AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */, + mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator()); mDisappearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 356842974cdc..b000e26a7658 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -17,6 +17,7 @@ package com.android.keyguard; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Rect; @@ -27,6 +28,7 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; +import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -334,10 +336,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit enableClipping(false); setAlpha(1f); setTranslationY(mAppearAnimationUtils.getStartTranslation()); - animate() - .setDuration(500) - .setInterpolator(mAppearAnimationUtils.getInterpolator()) - .translationY(0); + AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */, + 0, mAppearAnimationUtils.getInterpolator()); mAppearAnimationUtils.startAnimation2d( mLockPatternView.getCellStates(), new Runnable() { @@ -362,10 +362,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mLockPatternView.clearPattern(); enableClipping(false); setTranslationY(0); - animate() - .setDuration(300) - .setInterpolator(mDisappearAnimationUtils.getInterpolator()) - .translationY(-mDisappearAnimationUtils.getStartTranslation()); + AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 300 /* duration */, + -mDisappearAnimationUtils.getStartTranslation(), + mDisappearAnimationUtils.getInterpolator()); mDisappearAnimationUtils.startAnimation2d(mLockPatternView.getCellStates(), new Runnable() { @Override @@ -398,43 +397,16 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit long duration, float translationY, final boolean appearing, Interpolator interpolator, final Runnable finishListener) { - if (appearing) { - animatedCell.scale = 0.0f; - animatedCell.alpha = 1.0f; - } - animatedCell.translateY = appearing ? translationY : 0; - ValueAnimator animator = ValueAnimator.ofFloat(animatedCell.translateY, - appearing ? 0 : translationY); - animator.setInterpolator(interpolator); - animator.setDuration(duration); - animator.setStartDelay(delay); - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - float animatedFraction = animation.getAnimatedFraction(); - if (appearing) { - animatedCell.scale = animatedFraction; - } else { - animatedCell.alpha = 1 - animatedFraction; - } - animatedCell.translateY = (float) animation.getAnimatedValue(); - mLockPatternView.invalidate(); - } - }); + mLockPatternView.startCellStateAnimation(animatedCell, + 1f, appearing ? 1f : 0f, /* alpha */ + appearing ? translationY : 0f, appearing ? 0f : translationY, /* translation */ + appearing ? 0f : 1f, 1f /* scale */, + delay, duration, interpolator, finishListener); if (finishListener != null) { - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - finishListener.run(); - } - }); - // Also animate the Emergency call mAppearAnimationUtils.createAnimation(mEcaView, delay, duration, translationY, appearing, interpolator, null); } - animator.start(); - mLockPatternView.invalidate(); } @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index 4e9621af0876..f95b0aebfd70 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -67,12 +67,12 @@ public class KeyguardStatusView extends GridLayout { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { setEnableMarquee(true); } @Override - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { setEnableMarquee(false); } @@ -113,8 +113,8 @@ public class KeyguardStatusView extends GridLayout { mClockView.setShowCurrentUserTime(true); mOwnerInfo = (TextView) findViewById(R.id.owner_info); - final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); - setEnableMarquee(screenOn); + boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); + setEnableMarquee(shouldMarquee); refresh(); updateOwnerInfo(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index a90d084a751d..29aca54d8cca 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -103,6 +103,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { = "com.android.facelock.FACE_UNLOCK_STOPPED"; private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock"; + /** + * Mode in which we don't need to wake up the device when we get a fingerprint. + */ + private static final int FP_WAKE_NONE = 0; + + /** + * Mode in which we wake up the device, and directly dismiss Keyguard. Active when we acquire + * a fingerprint while the screen is off and the device was sleeping. + */ + private static final int FP_WAKE_DIRECT_UNLOCK = 1; + + /** + * Mode in which we wake up the device, but play the normal dismiss animation. Active when we + * acquire a fingerprint pulsing in doze mode. + * */ + private static final int FP_WAKE_WAKE_TO_BOUNCER = 2; + // Callback messages private static final int MSG_TIME_UPDATE = 301; private static final int MSG_BATTERY_UPDATE = 302; @@ -118,8 +135,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_USER_SWITCH_COMPLETE = 314; private static final int MSG_USER_INFO_CHANGED = 317; private static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318; - private static final int MSG_SCREEN_TURNED_ON = 319; - private static final int MSG_SCREEN_TURNED_OFF = 320; + private static final int MSG_STARTED_WAKING_UP = 319; + private static final int MSG_FINISHED_GOING_TO_SLEEP = 320; private static final int MSG_KEYGUARD_BOUNCER_CHANGED = 322; private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327; private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; @@ -156,6 +173,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mSwitchingUser; + private boolean mDeviceInteractive; private boolean mScreenOn; private SubscriptionManager mSubscriptionManager; private List<SubscriptionInfo> mSubscriptionInfo; @@ -212,11 +230,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_REPORT_EMERGENCY_CALL_ACTION: handleReportEmergencyCallAction(); break; - case MSG_SCREEN_TURNED_OFF: - handleScreenTurnedOff(msg.arg1); + case MSG_FINISHED_GOING_TO_SLEEP: + handleFinishedGoingToSleep(msg.arg1); break; - case MSG_SCREEN_TURNED_ON: - handleScreenTurnedOn(); + case MSG_STARTED_WAKING_UP: + handleStartedWakingUp(); break; case MSG_FACE_UNLOCK_STATE_CHANGED: handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2); @@ -249,7 +267,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static int sCurrentUser; - private boolean mWakeAndUnlocking; + private int mFpWakeMode; public synchronized static void setCurrentUser(int currentUser) { sCurrentUser = currentUser; @@ -372,19 +390,21 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) { return; } - if (!mScreenOn) { + if (!mDeviceInteractive && !mScreenOn) { releaseFingerprintWakeLock(); mWakeLock = mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME); mWakeLock.acquire(); - mWakeAndUnlocking = true; + mFpWakeMode = FP_WAKE_DIRECT_UNLOCK; if (DEBUG_FP_WAKELOCK) { Log.i(TAG, "fingerprint acquired, grabbing fp wakelock"); } mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable, FINGERPRINT_WAKELOCK_TIMEOUT_MS); + } else if (!mDeviceInteractive) { + mFpWakeMode = FP_WAKE_WAKE_TO_BOUNCER; } else { - mWakeAndUnlocking = false; + mFpWakeMode = FP_WAKE_NONE; } } @@ -410,7 +430,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void handleFingerprintAuthenticated() { - if (mWakeAndUnlocking) { + if (mFpWakeMode == FP_WAKE_WAKE_TO_BOUNCER || mFpWakeMode == FP_WAKE_DIRECT_UNLOCK) { if (DEBUG_FP_WAKELOCK) { Log.i(TAG, "fp wakelock: Authenticated, waking up..."); } @@ -429,7 +449,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); return; } - onFingerprintAuthenticated(userId, mWakeAndUnlocking); + onFingerprintAuthenticated(userId, mFpWakeMode == FP_WAKE_DIRECT_UNLOCK); } finally { setFingerprintRunningDetectionRunning(false); } @@ -765,24 +785,24 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return sInstance; } - protected void handleScreenTurnedOn() { + protected void handleStartedWakingUp() { updateFingerprintListeningState(); final int count = mCallbacks.size(); for (int i = 0; i < count; i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onScreenTurnedOn(); + cb.onStartedWakingUp(); } } } - protected void handleScreenTurnedOff(int arg1) { + protected void handleFinishedGoingToSleep(int arg1) { clearFingerprintRecognized(); final int count = mCallbacks.size(); for (int i = 0; i < count; i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { - cb.onScreenTurnedOff(arg1); + cb.onFinishedGoingToSleep(arg1); } } updateFingerprintListeningState(); @@ -1450,22 +1470,34 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // TODO: use these callbacks elsewhere in place of the existing notifyScreen*() // (KeyguardViewMediator, KeyguardHostView) + public void dispatchStartedWakingUp() { + synchronized (this) { + mDeviceInteractive = true; + } + mHandler.sendEmptyMessage(MSG_STARTED_WAKING_UP); + } + + public void dispatchFinishedGoingToSleep(int why) { + synchronized(this) { + mDeviceInteractive = false; + } + mHandler.sendMessage(mHandler.obtainMessage(MSG_FINISHED_GOING_TO_SLEEP, why, 0)); + } + public void dispatchScreenTurnedOn() { synchronized (this) { mScreenOn = true; } - mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON); } - public void dispatchScreenTurnedOff(int why) { + public void dispatchScreenTurnedOff() { synchronized(this) { mScreenOn = false; } - mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREEN_TURNED_OFF, why, 0)); } - public boolean isScreenOn() { - return mScreenOn; + public boolean isDeviceInteractive() { + return mDeviceInteractive; } /** diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 9fd8d30858aa..0cdf99999bb9 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -148,17 +148,17 @@ public class KeyguardUpdateMonitorCallback { } /** - * Called when the screen turns on + * Called when the device has started waking up. */ - public void onScreenTurnedOn() { } + public void onStartedWakingUp() { } /** - * Called when the screen turns off + * Called when the device has finished going to sleep. * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_ADMIN}, * {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, or * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT}. */ - public void onScreenTurnedOff(int why) { } + public void onFinishedGoingToSleep(int why) { } /** * Called when trust changes for a user. diff --git a/packages/MtpDocumentsProvider/Android.mk b/packages/MtpDocumentsProvider/Android.mk index 5f76a9a988fc..ec18463c7163 100644 --- a/packages/MtpDocumentsProvider/Android.mk +++ b/packages/MtpDocumentsProvider/Android.mk @@ -5,8 +5,6 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := MtpDocumentsProvider LOCAL_CERTIFICATE := media -LOCAL_PROGUARD_FLAGS := '-keepclassmembers class * {' \ - ' @com.android.internal.annotations.VisibleForTesting *; }' include $(BUILD_PACKAGE) include $(LOCAL_PATH)/tests/Android.mk diff --git a/packages/MtpDocumentsProvider/AndroidManifest.xml b/packages/MtpDocumentsProvider/AndroidManifest.xml index 6172354927ee..0172a4f031ee 100644 --- a/packages/MtpDocumentsProvider/AndroidManifest.xml +++ b/packages/MtpDocumentsProvider/AndroidManifest.xml @@ -2,6 +2,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.mtp" android:sharedUserId="android.media"> + <uses-feature android:name="android.hardware.usb.host" /> <application android:label="@string/app_label"> <provider android:name=".MtpDocumentsProvider" @@ -14,5 +15,17 @@ <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider> + <activity android:name=".ReceiverActivity" + android:theme="@android:style/Theme.NoDisplay" + android:screenOrientation="locked" + android:excludeFromRecents="true" + android:enabled="false"> + <intent-filter> + <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> + </intent-filter> + <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" + android:resource="@xml/device_filter" /> + </activity> + <service android:name=".MtpDocumentsService"></service> </application> </manifest> diff --git a/packages/MtpDocumentsProvider/res/xml/device_filter.xml b/packages/MtpDocumentsProvider/res/xml/device_filter.xml new file mode 100644 index 000000000000..7afa2b15d68f --- /dev/null +++ b/packages/MtpDocumentsProvider/res/xml/device_filter.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <!-- filter for MTP/PTP devices --> + <usb-device class="255" subclass="255" protocol="0" /> + <usb-device class="6" subclass="1" protocol="1" /> +</resources> diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java b/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java new file mode 100644 index 000000000000..aafe8846b8c3 --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +/** + * Static utilities for ID. + */ +abstract class Identifier { + // TODO: Make the ID persistent. + static String createRootId(long deviceId, long storageId) { + return String.format("%d:%d", deviceId, storageId); + } + + // TODO: Make the ID persistent. + static String createDocumentId(String rootId, long objectHandle) { + return String.format("%s:%d", rootId, objectHandle); + } +} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java new file mode 100644 index 000000000000..12eb91e7e865 --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +class MtpDocument { + static final int DUMMY_HANDLE_FOR_ROOT = 0; + + // TODO: Implement model class for MTP document. +} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 0cfa749d4935..58203c292196 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -18,6 +18,7 @@ package com.android.mtp; import android.content.ContentResolver; import android.database.Cursor; +import android.database.MatrixCursor; import android.os.CancellationSignal; import android.os.ParcelFileDescriptor; import android.provider.DocumentsContract; @@ -35,40 +36,74 @@ import java.io.IOException; * DocumentsProvider for MTP devices. */ public class MtpDocumentsProvider extends DocumentsProvider { - private static final String TAG = "MtpDocumentsProvider"; - public static final String AUTHORITY = "com.android.mtp.documents"; - + static final String AUTHORITY = "com.android.mtp.documents"; + static final String TAG = "MtpDocumentsProvider"; private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_ICON, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, Root.COLUMN_AVAILABLE_BYTES, }; - private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] { Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME, Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE, }; - private MtpManager mDeviceModel; + private static MtpDocumentsProvider sSingleton; + + private MtpManager mMtpManager; private ContentResolver mResolver; + /** + * Provides singleton instance to MtpDocumentsService. + */ + static MtpDocumentsProvider getInstance() { + return sSingleton; + } + @Override public boolean onCreate() { - mDeviceModel = new MtpManager(getContext()); + sSingleton = this; + mMtpManager = new MtpManager(getContext()); mResolver = getContext().getContentResolver(); return true; } @VisibleForTesting - void onCreateForTesting(MtpManager deviceModel, ContentResolver resolver) { - this.mDeviceModel = deviceModel; + void onCreateForTesting(MtpManager mtpManager, ContentResolver resolver) { + this.mMtpManager = mtpManager; this.mResolver = resolver; } @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { - throw new FileNotFoundException(); + if (projection == null) { + projection = MtpDocumentsProvider.DEFAULT_ROOT_PROJECTION; + } + final MatrixCursor cursor = new MatrixCursor(projection); + for (final int deviceId : mMtpManager.getOpenedDeviceIds()) { + try { + final MtpRoot[] roots = mMtpManager.getRoots(deviceId); + // TODO: Add retry logic here. + + for (final MtpRoot root : roots) { + final String rootId = Identifier.createRootId(deviceId, root.mStorageId); + final MatrixCursor.RowBuilder builder = cursor.newRow(); + builder.add(Root.COLUMN_ROOT_ID, rootId); + builder.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_IS_CHILD); + builder.add(Root.COLUMN_TITLE, root.mDescription); + builder.add( + Root.COLUMN_DOCUMENT_ID, + Identifier.createDocumentId(rootId, MtpDocument.DUMMY_HANDLE_FOR_ROOT)); + builder.add(Root.COLUMN_AVAILABLE_BYTES , root.mFreeSpace); + } + } catch (IOException error) { + Log.d(TAG, error.getMessage()); + } + } + cursor.setNotificationUri( + mResolver, DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY)); + return cursor; } @Override @@ -90,46 +125,36 @@ public class MtpDocumentsProvider extends DocumentsProvider { throw new FileNotFoundException(); } - // TODO: Remove annotation when the method starts to be used. - @VisibleForTesting - void openDevice(int deviceId) { - try { - mDeviceModel.openDevice(deviceId); - notifyRootsUpdate(); - } catch (IOException error) { - Log.d(TAG, "Failed to open the MTP device: " + deviceId); - } + void openDevice(int deviceId) throws IOException { + mMtpManager.openDevice(deviceId); + notifyRootsChange(); } - // TODO: Remove annotation when the method starts to be used. - @VisibleForTesting - void closeDevice(int deviceId) { - try { - mDeviceModel.closeDevice(deviceId); - notifyRootsUpdate(); - } catch (IOException error) { - Log.d(TAG, "Failed to close the MTP device: " + deviceId); - } + void closeDevice(int deviceId) throws IOException { + mMtpManager.closeDevice(deviceId); + notifyRootsChange(); } - // TODO: Remove annotation when the method starts to be used. - @VisibleForTesting void closeAllDevices() { boolean closed = false; - for (int deviceId : mDeviceModel.getOpenedDeviceIds()) { + for (int deviceId : mMtpManager.getOpenedDeviceIds()) { try { - mDeviceModel.closeDevice(deviceId); + mMtpManager.closeDevice(deviceId); closed = true; } catch (IOException d) { Log.d(TAG, "Failed to close the MTP device: " + deviceId); } } if (closed) { - notifyRootsUpdate(); + notifyRootsChange(); } } - private void notifyRootsUpdate() { + boolean hasOpenedDevices() { + return mMtpManager.getOpenedDeviceIds().length != 0; + } + + private void notifyRootsChange() { mResolver.notifyChange( DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY), null, diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java new file mode 100644 index 000000000000..328f618e4b39 --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.os.IBinder; +import android.util.Log; + +import java.io.IOException; + +/** + * Service to manage lifetime of DocumentsProvider's process. + * The service prevents the system from killing the process that holds USB connections. The service + * starts to run when the first MTP device is opened, and stops when the last MTP device is closed. + */ +public class MtpDocumentsService extends Service { + static final String ACTION_OPEN_DEVICE = "com.android.mtp.action.ACTION_OPEN_DEVICE"; + static final String EXTRA_DEVICE = "device"; + + Receiver mReceiver; + + @Override + public IBinder onBind(Intent intent) { + // The service is used via intents. + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + final IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED); + mReceiver = new Receiver(); + registerReceiver(mReceiver, filter); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent == null) { + // If intent is null, the service was restarted. + // TODO: Recover opened devices here. + return START_STICKY; + } + if (intent.getAction().equals(ACTION_OPEN_DEVICE)) { + final UsbDevice device = intent.<UsbDevice>getParcelableExtra(EXTRA_DEVICE); + try { + final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); + provider.openDevice(device.getDeviceId()); + return START_STICKY; + } catch (IOException error) { + Log.d(MtpDocumentsProvider.TAG, error.getMessage()); + } + } else { + Log.d(MtpDocumentsProvider.TAG, "Received unknown intent action."); + } + stopSelfIfNeeded(); + return Service.START_NOT_STICKY; + } + + @Override + public void onDestroy() { + final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); + provider.closeAllDevices(); + unregisterReceiver(mReceiver); + mReceiver = null; + super.onDestroy(); + } + + private void stopSelfIfNeeded() { + final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); + if (!provider.hasOpenedDevices()) { + stopSelf(); + } + } + + private class Receiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) { + final UsbDevice device = + (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); + try { + provider.closeDevice(device.getDeviceId()); + } catch (IOException error) { + Log.d(MtpDocumentsProvider.TAG, error.getMessage()); + } + stopSelfIfNeeded(); + } + } + } +} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java index 466a3ac28b54..05e3a72b3f9a 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java @@ -76,11 +76,7 @@ class MtpManager { } synchronized void closeDevice(int deviceId) throws IOException { - final MtpDevice device = mDevices.get(deviceId); - if (device == null) { - throw new IOException("USB device " + deviceId + " is not opened."); - } - mDevices.get(deviceId).close(); + getDevice(deviceId).close(); mDevices.remove(deviceId); } @@ -91,4 +87,22 @@ class MtpManager { } return result; } + + synchronized MtpRoot[] getRoots(int deviceId) throws IOException { + final MtpDevice device = getDevice(deviceId); + final int[] storageIds = device.getStorageIds(); + final MtpRoot[] results = new MtpRoot[storageIds.length]; + for (int i = 0; i < storageIds.length; i++) { + results[i] = new MtpRoot(device.getStorageInfo(storageIds[i])); + } + return results; + } + + private MtpDevice getDevice(int deviceId) throws IOException { + final MtpDevice device = mDevices.get(deviceId); + if (device == null) { + throw new IOException("USB device " + deviceId + " is not opened."); + } + return device; + } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.java new file mode 100644 index 000000000000..ab1688272957 --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +import android.mtp.MtpStorageInfo; + +import com.android.internal.annotations.VisibleForTesting; + +class MtpRoot { + final long mStorageId; + final String mDescription; + final long mFreeSpace; + final long mMaxCapacity; + final String mVolumeIdentifier; + + @VisibleForTesting + MtpRoot(long storageId, + String description, + long freeSpace, + long maxCapacity, + String volumeIdentifier) { + this.mStorageId = storageId; + this.mDescription = description; + this.mFreeSpace = freeSpace; + this.mMaxCapacity = maxCapacity; + this.mVolumeIdentifier = volumeIdentifier; + } + + MtpRoot(MtpStorageInfo storageInfo) { + mStorageId = storageInfo.getStorageId(); + mDescription = storageInfo.getDescription(); + mFreeSpace = storageInfo.getFreeSpace(); + mMaxCapacity = storageInfo.getMaxCapacity(); + if (!storageInfo.getVolumeIdentifier().equals("")) { + mVolumeIdentifier = storageInfo.getVolumeIdentifier(); + } else { + mVolumeIdentifier = null; + } + } +} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java b/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java new file mode 100644 index 000000000000..3ad2397cadba --- /dev/null +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +import android.app.Activity; +import android.content.Intent; +import android.hardware.usb.UsbManager; +import android.os.Bundle; + +/** + * Invisible activity to receive intents. + * To show the application chooser for the UsbManager.ACTION_USB_DEVICE_ATTACHED intent, the intent + * should be received by activity. The activity has NoDisplay theme and immediately terminate after + * routing intent to MtpDocumentsService. + */ +public class ReceiverActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) { + final Intent serviceIntent = new Intent( + MtpDocumentsService.ACTION_OPEN_DEVICE, + null, + this, + MtpDocumentsService.class); + serviceIntent.putExtra( + UsbManager.EXTRA_DEVICE, + getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE)); + startService(serviceIntent); + } + finish(); + } +} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 7e91cc765f29..ad18dd95608f 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -16,9 +16,10 @@ package com.android.mtp; -import android.content.Context; import android.database.ContentObserver; +import android.database.Cursor; import android.net.Uri; +import android.provider.DocumentsContract.Root; import android.test.AndroidTestCase; import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.SmallTest; @@ -30,69 +31,141 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { public void testOpenAndCloseDevice() throws Exception { final ContentResolver resolver = new ContentResolver(); final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - provider.onCreateForTesting(new MtpManagerMock(getContext()), resolver); + final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); + mtpManager.addValidDevice(0); + provider.onCreateForTesting(mtpManager, resolver); - provider.openDevice(MtpManagerMock.SUCCESS_DEVICE_ID); + assertEquals(0, resolver.changeCount); + + provider.openDevice(0); assertEquals(1, resolver.changeCount); - provider.closeDevice(MtpManagerMock.SUCCESS_DEVICE_ID); + + provider.closeDevice(0); assertEquals(2, resolver.changeCount); - provider.openDevice(MtpManagerMock.FAILURE_DEVICE_ID); + int exceptionCounter = 0; + try { + provider.openDevice(1); + } catch (IOException error) { + exceptionCounter++; + } assertEquals(2, resolver.changeCount); - provider.closeDevice(MtpManagerMock.FAILURE_DEVICE_ID); + try { + provider.closeDevice(1); + } catch (IOException error) { + exceptionCounter++; + } assertEquals(2, resolver.changeCount); + assertEquals(2, exceptionCounter); } - public void testCloseAllDevices() { + public void testCloseAllDevices() throws IOException { final ContentResolver resolver = new ContentResolver(); final MtpDocumentsProvider provider = new MtpDocumentsProvider(); - provider.onCreateForTesting(new MtpManagerMock(getContext()), resolver); + final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); + mtpManager.addValidDevice(0); + provider.onCreateForTesting(mtpManager, resolver); provider.closeAllDevices(); assertEquals(0, resolver.changeCount); - provider.openDevice(MtpManagerMock.SUCCESS_DEVICE_ID); + provider.openDevice(0); assertEquals(1, resolver.changeCount); provider.closeAllDevices(); assertEquals(2, resolver.changeCount); } - private static class MtpManagerMock extends MtpManager { - final static int SUCCESS_DEVICE_ID = 1; - final static int FAILURE_DEVICE_ID = 2; - - private boolean opened = false; - - MtpManagerMock(Context context) { - super(context); + public void testQueryRoots() throws Exception { + final ContentResolver resolver = new ContentResolver(); + final MtpDocumentsProvider provider = new MtpDocumentsProvider(); + final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); + mtpManager.addValidDevice(0); + mtpManager.addValidDevice(1); + mtpManager.setRoots(0, new MtpRoot[] { + new MtpRoot( + 1 /* storageId */, + "Storage A" /* volume description */, + 1024 /* free space */, + 2048 /* total space */, + "" /* no volume identifier */) + }); + mtpManager.setRoots(1, new MtpRoot[] { + new MtpRoot( + 1 /* storageId */, + "Storage B" /* volume description */, + 2048 /* free space */, + 4096 /* total space */, + "Identifier B" /* no volume identifier */) + }); + provider.onCreateForTesting(mtpManager, resolver); + assertEquals(0, provider.queryRoots(null).getCount()); + + { + provider.openDevice(0); + final Cursor cursor = provider.queryRoots(null); + assertEquals(1, cursor.getCount()); + cursor.moveToNext(); + assertEquals("0:1", cursor.getString(0)); + assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1)); + // TODO: Add storage icon for MTP devices. + assertTrue(cursor.isNull(2) /* icon */); + assertEquals("Storage A", cursor.getString(3)); + assertEquals("0:1:0", cursor.getString(4)); + assertEquals(1024, cursor.getInt(5)); } - @Override - void openDevice(int deviceId) throws IOException { - if (deviceId == SUCCESS_DEVICE_ID) { - opened = true; - } else { - throw new IOException(); - } + { + provider.openDevice(1); + final Cursor cursor = provider.queryRoots(null); + assertEquals(2, cursor.getCount()); + cursor.moveToNext(); + cursor.moveToNext(); + assertEquals("1:1", cursor.getString(0)); + assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1)); + // TODO: Add storage icon for MTP devices. + assertTrue(cursor.isNull(2) /* icon */); + assertEquals("Storage B", cursor.getString(3)); + assertEquals("1:1:0", cursor.getString(4)); + assertEquals(2048, cursor.getInt(5)); } - @Override - void closeDevice(int deviceId) throws IOException { - if (opened && deviceId == SUCCESS_DEVICE_ID) { - opened = false; - } else { - throw new IOException(); - } + { + provider.closeAllDevices(); + final Cursor cursor = provider.queryRoots(null); + assertEquals(0, cursor.getCount()); } + } - @Override - int[] getOpenedDeviceIds() { - if (opened) { - return new int[] { SUCCESS_DEVICE_ID }; - } else { - return new int[0]; - } + public void testQueryRoots_error() throws IOException { + final ContentResolver resolver = new ContentResolver(); + final MtpDocumentsProvider provider = new MtpDocumentsProvider(); + final MtpManagerMock mtpManager = new MtpManagerMock(getContext()); + mtpManager.addValidDevice(0); + mtpManager.addValidDevice(1); + // Not set roots for device 0 so that MtpManagerMock#getRoots throws IOException. + mtpManager.setRoots(1, new MtpRoot[] { + new MtpRoot( + 1 /* storageId */, + "Storage B" /* volume description */, + 2048 /* free space */, + 4096 /* total space */, + "Identifier B" /* no volume identifier */) + }); + provider.onCreateForTesting(mtpManager, resolver); + { + provider.openDevice(0); + provider.openDevice(1); + final Cursor cursor = provider.queryRoots(null); + assertEquals(1, cursor.getCount()); + cursor.moveToNext(); + assertEquals("1:1", cursor.getString(0)); + assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1)); + // TODO: Add storage icon for MTP devices. + assertTrue(cursor.isNull(2) /* icon */); + assertEquals("Storage B", cursor.getString(3)); + assertEquals("1:1:0", cursor.getString(4)); + assertEquals(2048, cursor.getInt(5)); } } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerMock.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerMock.java new file mode 100644 index 000000000000..82db55211bfb --- /dev/null +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerMock.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mtp; + +import android.content.Context; + +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +public class MtpManagerMock extends MtpManager { + private final Set<Integer> mValidDevices = new HashSet<Integer>(); + private final Set<Integer> mOpenedDevices = new TreeSet<Integer>(); + private final Map<Integer, MtpRoot[]> mRoots = new HashMap<Integer, MtpRoot[]>(); + + MtpManagerMock(Context context) { + super(context); + } + + void addValidDevice(int deviceId) { + mValidDevices.add(deviceId); + } + + void setRoots(int deviceId, MtpRoot[] roots) { + mRoots.put(deviceId, roots); + } + + @Override + void openDevice(int deviceId) throws IOException { + if (!mValidDevices.contains(deviceId) || mOpenedDevices.contains(deviceId)) { + throw new IOException(); + } + mOpenedDevices.add(deviceId); + } + + @Override + void closeDevice(int deviceId) throws IOException { + if (!mValidDevices.contains(deviceId) || !mOpenedDevices.contains(deviceId)) { + throw new IOException(); + } + mOpenedDevices.remove(deviceId); + } + + @Override + MtpRoot[] getRoots(int deviceId) throws IOException { + if (mRoots.containsKey(deviceId)) { + return mRoots.get(deviceId); + } else { + throw new IOException("getRoots error"); + } + } + + @Override + int[] getOpenedDeviceIds() { + int i = 0; + final int[] result = new int[mOpenedDevices.size()]; + for (int deviceId : mOpenedDevices) { + result[i++] = deviceId; + } + return result; + } +} diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml index 58dfc2ace7d7..461a92fcca8a 100644 --- a/packages/PrintSpooler/res/values-eu-rES/strings.xml +++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml @@ -30,7 +30,7 @@ <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> orriak"</string> <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> orriko tartea"</string> <string name="pages_range_example" msgid="8558694453556945172">"adib., 1-5, 8,11-13"</string> - <string name="print_preview" msgid="8010217796057763343">"Inprimatzearen aurrebista"</string> + <string name="print_preview" msgid="8010217796057763343">"Inprimatze-aurrebista"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Aurrebista ikusteko, instalatu PDF ikustailea"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Inprimatzeko aplikazioak matxura izan du"</string> <string name="generating_print_job" msgid="3119608742651698916">"Inprimatze-lana sortzen"</string> diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index 3c5dae3eda36..6baa4b374345 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -679,7 +679,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (resolvedActivities.get(0).activityInfo.exported) { intent.putExtra(PrintService.EXTRA_PRINT_JOB_INFO, mPrintJob); intent.putExtra(PrintService.EXTRA_PRINTER_INFO, printer); - intent.putExtra(PrintService.EXTRA_PRINT_JOB_INFO, + intent.putExtra(PrintService.EXTRA_PRINT_DOCUMENT_INFO, mPrintedDocument.getDocumentInfo().info); // This is external activity and may not be there. diff --git a/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java b/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java index 441474d7fc32..df76125a99f2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/animation/AppearAnimationUtils.java @@ -16,11 +16,18 @@ package com.android.settingslib.animation; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.content.Context; +import android.view.RenderNodeAnimator; import android.view.View; +import android.view.ViewPropertyAnimator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import com.android.internal.widget.LockPatternView; import com.android.settingslib.R; /** @@ -174,24 +181,63 @@ public class AppearAnimationUtils implements AppearAnimationCreator<View> { } @Override - public void createAnimation(View view, long delay, long duration, float translationY, - boolean appearing, Interpolator interpolator, Runnable endRunnable) { + public void createAnimation(final View view, long delay, long duration, float translationY, + boolean appearing, Interpolator interpolator, final Runnable endRunnable) { if (view != null) { view.setAlpha(appearing ? 0f : 1.0f); view.setTranslationY(appearing ? translationY : 0); - view.animate() - .alpha(appearing ? 1f : 0f) - .translationY(appearing ? 0 : translationY) - .setInterpolator(interpolator) - .setDuration(duration) - .setStartDelay(delay); + Animator alphaAnim; + float targetAlpha = appearing ? 1f : 0f; + if (view.isHardwareAccelerated()) { + RenderNodeAnimator alphaAnimRt = new RenderNodeAnimator(RenderNodeAnimator.ALPHA, + targetAlpha); + alphaAnimRt.setTarget(view); + alphaAnim = alphaAnimRt; + } else { + alphaAnim = ObjectAnimator.ofFloat(view, View.ALPHA, view.getAlpha(), targetAlpha); + } + alphaAnim.setInterpolator(interpolator); + alphaAnim.setDuration(duration); + alphaAnim.setStartDelay(delay); if (view.hasOverlappingRendering()) { - view.animate().withLayer(); + view.setLayerType(View.LAYER_TYPE_HARDWARE, null); + alphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + view.setLayerType(View.LAYER_TYPE_NONE, null); + } + }); } if (endRunnable != null) { - view.animate().withEndAction(endRunnable); + alphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + endRunnable.run(); + } + }); } + alphaAnim.start(); + startTranslationYAnimation(view, delay, duration, appearing ? 0 : translationY, + interpolator); + } + } + + public static void startTranslationYAnimation(View view, long delay, long duration, + float endTranslationY, Interpolator interpolator) { + Animator translationAnim; + if (view.isHardwareAccelerated()) { + RenderNodeAnimator translationAnimRt = new RenderNodeAnimator( + RenderNodeAnimator.TRANSLATION_Y, endTranslationY); + translationAnimRt.setTarget(view); + translationAnim = translationAnimRt; + } else { + translationAnim = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, + view.getTranslationY(), endTranslationY); } + translationAnim.setInterpolator(interpolator); + translationAnim.setDuration(duration); + translationAnim.setStartDelay(delay); + translationAnim.start(); } public class AppearAnimationProperties { diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 40d5437b0a72..9eb7d0ebfcc3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -1239,6 +1239,21 @@ public class ApplicationsState { } }; + public static final AppFilter FILTER_PERSONAL_WITHOUT_DISABLED_UNTIL_USED = new AppFilter() { + private int mCurrentUser; + + public void init() { + mCurrentUser = ActivityManager.getCurrentUser(); + } + + @Override + public boolean filterApp(AppEntry entry) { + return UserHandle.getUserId(entry.info.uid) == mCurrentUser && + entry.info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; + } + }; + + public static final AppFilter FILTER_WORK = new AppFilter() { private int mCurrentUser; diff --git a/packages/SettingsProvider/res/values-af/defaults.xml b/packages/SettingsProvider/res/values-af/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-af/defaults.xml +++ b/packages/SettingsProvider/res/values-af/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-am/defaults.xml b/packages/SettingsProvider/res/values-am/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-am/defaults.xml +++ b/packages/SettingsProvider/res/values-am/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ar/defaults.xml b/packages/SettingsProvider/res/values-ar/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ar/defaults.xml +++ b/packages/SettingsProvider/res/values-ar/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-az-rAZ/defaults.xml b/packages/SettingsProvider/res/values-az-rAZ/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-az-rAZ/defaults.xml +++ b/packages/SettingsProvider/res/values-az-rAZ/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-bg/defaults.xml b/packages/SettingsProvider/res/values-bg/defaults.xml index aee229efecc7..715e78f83391 100644 --- a/packages/SettingsProvider/res/values-bg/defaults.xml +++ b/packages/SettingsProvider/res/values-bg/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s от %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-bn-rBD/defaults.xml b/packages/SettingsProvider/res/values-bn-rBD/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-bn-rBD/defaults.xml +++ b/packages/SettingsProvider/res/values-bn-rBD/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ca/defaults.xml b/packages/SettingsProvider/res/values-ca/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ca/defaults.xml +++ b/packages/SettingsProvider/res/values-ca/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-cs/defaults.xml +++ b/packages/SettingsProvider/res/values-cs/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-da/defaults.xml b/packages/SettingsProvider/res/values-da/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-da/defaults.xml +++ b/packages/SettingsProvider/res/values-da/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-de/defaults.xml +++ b/packages/SettingsProvider/res/values-de/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-el/defaults.xml b/packages/SettingsProvider/res/values-el/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-el/defaults.xml +++ b/packages/SettingsProvider/res/values-el/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rAU/defaults.xml b/packages/SettingsProvider/res/values-en-rAU/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-en-rAU/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rAU/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rGB/defaults.xml b/packages/SettingsProvider/res/values-en-rGB/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-en-rGB/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rGB/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rIN/defaults.xml b/packages/SettingsProvider/res/values-en-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-en-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-en-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-es-rUS/defaults.xml b/packages/SettingsProvider/res/values-es-rUS/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-es-rUS/defaults.xml +++ b/packages/SettingsProvider/res/values-es-rUS/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-es/defaults.xml +++ b/packages/SettingsProvider/res/values-es/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-et-rEE/defaults.xml b/packages/SettingsProvider/res/values-et-rEE/defaults.xml index 71e91aec8cc5..5ec05cb5688e 100644 --- a/packages/SettingsProvider/res/values-et-rEE/defaults.xml +++ b/packages/SettingsProvider/res/values-et-rEE/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s, %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-eu-rES/defaults.xml b/packages/SettingsProvider/res/values-eu-rES/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-eu-rES/defaults.xml +++ b/packages/SettingsProvider/res/values-eu-rES/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-fa/defaults.xml b/packages/SettingsProvider/res/values-fa/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-fa/defaults.xml +++ b/packages/SettingsProvider/res/values-fa/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-fi/defaults.xml b/packages/SettingsProvider/res/values-fi/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-fi/defaults.xml +++ b/packages/SettingsProvider/res/values-fi/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml index beba56e52d67..b7280139184a 100644 --- a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml +++ b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s de %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-fr/defaults.xml +++ b/packages/SettingsProvider/res/values-fr/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-gl-rES/defaults.xml b/packages/SettingsProvider/res/values-gl-rES/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-gl-rES/defaults.xml +++ b/packages/SettingsProvider/res/values-gl-rES/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-gu-rIN/defaults.xml b/packages/SettingsProvider/res/values-gu-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-gu-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-gu-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-hi/defaults.xml b/packages/SettingsProvider/res/values-hi/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-hi/defaults.xml +++ b/packages/SettingsProvider/res/values-hi/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-hr/defaults.xml b/packages/SettingsProvider/res/values-hr/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-hr/defaults.xml +++ b/packages/SettingsProvider/res/values-hr/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-hu/defaults.xml b/packages/SettingsProvider/res/values-hu/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-hu/defaults.xml +++ b/packages/SettingsProvider/res/values-hu/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-hy-rAM/defaults.xml b/packages/SettingsProvider/res/values-hy-rAM/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-hy-rAM/defaults.xml +++ b/packages/SettingsProvider/res/values-hy-rAM/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-in/defaults.xml b/packages/SettingsProvider/res/values-in/defaults.xml index 012a65ff1ab3..71f1d3b1569d 100644 --- a/packages/SettingsProvider/res/values-in/defaults.xml +++ b/packages/SettingsProvider/res/values-in/defaults.xml @@ -23,4 +23,5 @@ <!-- String.format failed for translation --> <!-- no translation found for def_device_name_simple (9037785625140748221) --> <skip /> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-is-rIS/defaults.xml b/packages/SettingsProvider/res/values-is-rIS/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-is-rIS/defaults.xml +++ b/packages/SettingsProvider/res/values-is-rIS/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml index 3ea32a17dd0f..524132e57827 100644 --- a/packages/SettingsProvider/res/values-it/defaults.xml +++ b/packages/SettingsProvider/res/values-it/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-iw/defaults.xml b/packages/SettingsProvider/res/values-iw/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-iw/defaults.xml +++ b/packages/SettingsProvider/res/values-iw/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ja/defaults.xml b/packages/SettingsProvider/res/values-ja/defaults.xml index 3ea32a17dd0f..524132e57827 100644 --- a/packages/SettingsProvider/res/values-ja/defaults.xml +++ b/packages/SettingsProvider/res/values-ja/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ka-rGE/defaults.xml b/packages/SettingsProvider/res/values-ka-rGE/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ka-rGE/defaults.xml +++ b/packages/SettingsProvider/res/values-ka-rGE/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml b/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml +++ b/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-km-rKH/defaults.xml b/packages/SettingsProvider/res/values-km-rKH/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-km-rKH/defaults.xml +++ b/packages/SettingsProvider/res/values-km-rKH/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-kn-rIN/defaults.xml b/packages/SettingsProvider/res/values-kn-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-kn-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-kn-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ko/defaults.xml b/packages/SettingsProvider/res/values-ko/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ko/defaults.xml +++ b/packages/SettingsProvider/res/values-ko/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ky-rKG/defaults.xml b/packages/SettingsProvider/res/values-ky-rKG/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ky-rKG/defaults.xml +++ b/packages/SettingsProvider/res/values-ky-rKG/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-lo-rLA/defaults.xml b/packages/SettingsProvider/res/values-lo-rLA/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-lo-rLA/defaults.xml +++ b/packages/SettingsProvider/res/values-lo-rLA/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-lt/defaults.xml b/packages/SettingsProvider/res/values-lt/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-lt/defaults.xml +++ b/packages/SettingsProvider/res/values-lt/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-lv/defaults.xml b/packages/SettingsProvider/res/values-lv/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-lv/defaults.xml +++ b/packages/SettingsProvider/res/values-lv/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-mk-rMK/defaults.xml b/packages/SettingsProvider/res/values-mk-rMK/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-mk-rMK/defaults.xml +++ b/packages/SettingsProvider/res/values-mk-rMK/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ml-rIN/defaults.xml b/packages/SettingsProvider/res/values-ml-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ml-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-ml-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-mn-rMN/defaults.xml b/packages/SettingsProvider/res/values-mn-rMN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-mn-rMN/defaults.xml +++ b/packages/SettingsProvider/res/values-mn-rMN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-mr-rIN/defaults.xml b/packages/SettingsProvider/res/values-mr-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-mr-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-mr-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ms-rMY/defaults.xml b/packages/SettingsProvider/res/values-ms-rMY/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ms-rMY/defaults.xml +++ b/packages/SettingsProvider/res/values-ms-rMY/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-my-rMM/defaults.xml b/packages/SettingsProvider/res/values-my-rMM/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-my-rMM/defaults.xml +++ b/packages/SettingsProvider/res/values-my-rMM/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-nb/defaults.xml b/packages/SettingsProvider/res/values-nb/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-nb/defaults.xml +++ b/packages/SettingsProvider/res/values-nb/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ne-rNP/defaults.xml b/packages/SettingsProvider/res/values-ne-rNP/defaults.xml index 012a65ff1ab3..71f1d3b1569d 100644 --- a/packages/SettingsProvider/res/values-ne-rNP/defaults.xml +++ b/packages/SettingsProvider/res/values-ne-rNP/defaults.xml @@ -23,4 +23,5 @@ <!-- String.format failed for translation --> <!-- no translation found for def_device_name_simple (9037785625140748221) --> <skip /> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-nl/defaults.xml +++ b/packages/SettingsProvider/res/values-nl/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-pa-rIN/defaults.xml b/packages/SettingsProvider/res/values-pa-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-pa-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-pa-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-pl/defaults.xml +++ b/packages/SettingsProvider/res/values-pl/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml +++ b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml +++ b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-pt/defaults.xml b/packages/SettingsProvider/res/values-pt/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-pt/defaults.xml +++ b/packages/SettingsProvider/res/values-pt/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ro/defaults.xml b/packages/SettingsProvider/res/values-ro/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ro/defaults.xml +++ b/packages/SettingsProvider/res/values-ro/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ru/defaults.xml b/packages/SettingsProvider/res/values-ru/defaults.xml index 3ea32a17dd0f..524132e57827 100644 --- a/packages/SettingsProvider/res/values-ru/defaults.xml +++ b/packages/SettingsProvider/res/values-ru/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-si-rLK/defaults.xml b/packages/SettingsProvider/res/values-si-rLK/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-si-rLK/defaults.xml +++ b/packages/SettingsProvider/res/values-si-rLK/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sk/defaults.xml b/packages/SettingsProvider/res/values-sk/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-sk/defaults.xml +++ b/packages/SettingsProvider/res/values-sk/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sl/defaults.xml b/packages/SettingsProvider/res/values-sl/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-sl/defaults.xml +++ b/packages/SettingsProvider/res/values-sl/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sq-rAL/defaults.xml b/packages/SettingsProvider/res/values-sq-rAL/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-sq-rAL/defaults.xml +++ b/packages/SettingsProvider/res/values-sq-rAL/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sr/defaults.xml b/packages/SettingsProvider/res/values-sr/defaults.xml index 3ea32a17dd0f..524132e57827 100644 --- a/packages/SettingsProvider/res/values-sr/defaults.xml +++ b/packages/SettingsProvider/res/values-sr/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sv/defaults.xml b/packages/SettingsProvider/res/values-sv/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-sv/defaults.xml +++ b/packages/SettingsProvider/res/values-sv/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-sw/defaults.xml b/packages/SettingsProvider/res/values-sw/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-sw/defaults.xml +++ b/packages/SettingsProvider/res/values-sw/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ta-rIN/defaults.xml b/packages/SettingsProvider/res/values-ta-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ta-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-ta-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-te-rIN/defaults.xml b/packages/SettingsProvider/res/values-te-rIN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-te-rIN/defaults.xml +++ b/packages/SettingsProvider/res/values-te-rIN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-th/defaults.xml b/packages/SettingsProvider/res/values-th/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-th/defaults.xml +++ b/packages/SettingsProvider/res/values-th/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-tl/defaults.xml b/packages/SettingsProvider/res/values-tl/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-tl/defaults.xml +++ b/packages/SettingsProvider/res/values-tl/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-tr/defaults.xml b/packages/SettingsProvider/res/values-tr/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-tr/defaults.xml +++ b/packages/SettingsProvider/res/values-tr/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-uk/defaults.xml b/packages/SettingsProvider/res/values-uk/defaults.xml index 7655a19a182f..a8e1fe819184 100644 --- a/packages/SettingsProvider/res/values-uk/defaults.xml +++ b/packages/SettingsProvider/res/values-uk/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%2$s о %1$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-ur-rPK/defaults.xml b/packages/SettingsProvider/res/values-ur-rPK/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-ur-rPK/defaults.xml +++ b/packages/SettingsProvider/res/values-ur-rPK/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml b/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml +++ b/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-vi/defaults.xml b/packages/SettingsProvider/res/values-vi/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-vi/defaults.xml +++ b/packages/SettingsProvider/res/values-vi/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml +++ b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values-zu/defaults.xml b/packages/SettingsProvider/res/values-zu/defaults.xml index 22443a5673ea..4a87a1250404 100644 --- a/packages/SettingsProvider/res/values-zu/defaults.xml +++ b/packages/SettingsProvider/res/values-zu/defaults.xml @@ -21,4 +21,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> </resources> diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 3f0d71c1d43b..1cd2908e77e9 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -210,4 +210,6 @@ <!-- Default state of tap to wake --> <bool name="def_double_tap_to_wake">true</bool> + <!-- Default for Settings.Secure.NFC_PAYMENT_COMPONENT --> + <string name="def_nfc_payment_component"></string> </resources> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 8d9f3fd4e9fd..2a6825225a8e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1867,7 +1867,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 121; + private static final int SETTINGS_VERSION = 122; private final int mUserId; @@ -1999,6 +1999,24 @@ public class SettingsProvider extends ContentProvider { // here; SettingsState knows how to handle pre-version 120 files. currentVersion = 121; + if (currentVersion == 121) { + // Version 122: allow OEMs to set a default payment component in resources. + // Note that we only write the default if no default has been set; + // if there is, we just leave the default at whatever it currently is. + final SettingsState secureSettings = getSecureSettingsLocked(userId); + String defaultComponent = (getContext().getResources().getString( + R.string.def_nfc_payment_component)); + Setting currentSetting = secureSettings.getSettingLocked( + Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT); + if (defaultComponent != null && !defaultComponent.isEmpty() && + currentSetting == null) { + secureSettings.insertSettingLocked( + Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, + defaultComponent, + SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 122; + } // vXXX: Add new settings above this point. // Return the current version. diff --git a/packages/SystemUI/res/anim/navbar_fade_in.xml b/packages/SystemUI/res/anim/navbar_fade_in.xml new file mode 100644 index 000000000000..e3429e68dd13 --- /dev/null +++ b/packages/SystemUI/res/anim/navbar_fade_in.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2015 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<alpha xmlns:android="http://schemas.android.com/apk/res/android" + android:fromAlpha="0.0" + android:toAlpha="1.0" + android:interpolator="@android:interpolator/linear_out_slow_in" + android:duration="200"/> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 865bafd5a957..53d5e056ca6e 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gasgebruiker"</string> <string name="guest_notification_text" msgid="335747957734796689">"Verwyder gasgebruiker om programme en data uit te vee"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"VERWYDER GAS"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Meld gebruiker af"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"MELD GEBRUIKER AF"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Voeg nuwe gebruiker by?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel.\n\nEnige gebruiker kan programme vir al die ander gebruikers opdateer."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string> @@ -427,9 +425,11 @@ <string name="accessibility_managed_profile" msgid="6613641363112584120">"Werkprofiel"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Pret vir party mense, maar nie vir almal nie"</string> <string name="tuner_warning" msgid="8730648121973575701">"Stelsel-UI-ontvanger gee jou ekstra maniere om die Android-gebruikerkoppelvlak in te stel en te pasmaak. Hierdie eksperimentele kenmerke kan in toekomstige uitreikings verander, breek of verdwyn. Gaan versigtig voort."</string> - <string name="tuner_persistent_warning" msgid="8597333795565621795">"Hierdie eksperimentele kenmerke kan in toekomstige uitreikings verander, breek of verdwyn. Gaan versigtig voort."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Hierdie eksperimentele kenmerke kan in toekomstige weergawes verander, breek of verdwyn. Gaan versigtig voort."</string> <string name="got_it" msgid="2239653834387972602">"Het dit"</string> <string name="tuner_toast" msgid="603429811084428439">"Geluk! Stelsel-UI-ontvanger is by Instellings gevoeg"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Verwyder uit Instellings"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Verwyder Stelsel-UI-ontvanger uit Instellings en staak die gebruik van al sy kenmerke?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index b339a68652e9..aa16ec6baef4 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"የእንግዳ ተጠቃሚ"</string> <string name="guest_notification_text" msgid="335747957734796689">"መተግበሪያዎችና ውሂብ ለመሰረዝ እንግዳ ተጣቀሚን ያስወግዱ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"እንግዳን አስወግድ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ተጠቃሚን አስወጣ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ተጠቃሚን አስወጣ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"አዲስ ተጠቃሚ ይታከል?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"እርስዎ አንድ አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሱ ቦታ ማዘጋጀት አለበት።\n\nማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ሊያዘምን ይችላል።"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"የባትሪ ኃይል ቆጣቢ በርቷል"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"እንኳን ደስ ያለዎት! የስርዓት በይነገጽ መቃኛ ወደ ቅንብሮች ታክሏል"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ከቅንብሮች አስወግድ"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ከቅንብሮች ላይ የስርዓት በይነገጽ መቃኛ ተወግዶ ሁሉም ባህሪዎቹን መጠቀም ይቁም?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index a3cf9ec3c4d6..752b3c2c84f2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -348,12 +348,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"مستخدم ضيف"</string> <string name="guest_notification_text" msgid="335747957734796689">"لحذف التطبيقات والبيانات، عليك إزالة حساب الضيف"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"إزالة الضيف"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"خروج المستخدم"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"خروج المستخدم"</string> <string name="user_add_user_title" msgid="4553596395824132638">"هل تريد إضافة مستخدم جديد؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"عند إضافة مستخدم جديد، يلزمه إعداد مساحته.\n\nعلمًا بأنه يُمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"وضع توفير الطاقة قيد التشغيل"</string> @@ -436,4 +434,6 @@ <string name="tuner_toast" msgid="603429811084428439">"تهانينا! تمت إضافة أداة ضبط واجهة مستخدم النظام إلى الإعدادات"</string> <string name="remove_from_settings" msgid="8389591916603406378">"إزالة من الإعدادات"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"هل تريد إزالة أداة ضبط واجهة مستخدم النظام من الإعدادات وإيقاف استخدام كل ميزاتها؟"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index 59b18d5751fb..f7fa3edc12f7 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Qonaq istifadəçi"</string> <string name="guest_notification_text" msgid="335747957734796689">"Tətbiq və datanı silmək üçün qonaq istifadəçini silin"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"QONAĞI ÇIXARIN"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"İstifadəçi çıxışı"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"İSTİFADƏÇİ ÇIXIŞI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Yeni istifadəçi əlavə edilsin?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni istifadəçi əlavə etdiyiniz zaman həmin şəxs öz yerini quraşdırmalıdır. \n\n İstənilən istifadəçi bütün digər istifadəçilərdən olan tətbiqləri güncəlləşdirə bilər."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Enerji qənaəti aktivdir"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Təbriklər! System UI Tuner Ayarlara əlavə edildi"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Ayarlardan Silin"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Ayarlardan silinsin və onun bütün funksiyalarından istifadə dayandırılsın?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 8da6554eecb3..ba653ef2f8e1 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Гост"</string> <string name="guest_notification_text" msgid="335747957734796689">"Премахнете госта, за да се изтрият приложенията и данните"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ПРЕМАХВАНЕ НА ГОСТА"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Излизане на потребителя"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ИЗЛИЗАНЕ НА ПОТРЕБИТЕЛЯ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Да се добави ли нов потреб.?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Режимът за запазване на батерията е включен"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Поздравления! Тунерът на системния потребителски интерфейс е добавен към „Настройки“"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Премахване от „Настройки“"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Да се премахне ли от „Настройки“ тунерът на системния потребителски интерфейс и да се спре ли използването на всичките му функции?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 384ab7fe1f1f..29206c9fa04a 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"অতিথি ব্যবহারকারী"</string> <string name="guest_notification_text" msgid="335747957734796689">"অ্যাপ্লিকেশান এবং ডেটা মুছে ফেলার জন্য অতিথি ব্যবহারকারী সরান।"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"অতিথি সরান"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ব্যবহারকারীকে লগ-আউট করুন"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ব্যবহারকারীকে লগ-আউট করুন"</string> <string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যবহারকারীকে যোগ করবেন?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ব্যাটারি সেভার চালু রয়েছে"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"অভিনন্দন! সেটিংস -এ সিস্টেম UI টিউনার যোগ করা হয়েছে"</string> <string name="remove_from_settings" msgid="8389591916603406378">"সেটিংস থেকে সরান"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"সেটিংস থেকে সিস্টেম UI টিউনার সরাতে এবং এটির সমস্ত বৈশিষ্ট্য ব্যবহার করা বন্ধ করতে চান?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 7ac7414cd1a0..9696c551722f 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuari convidat"</string> <string name="guest_notification_text" msgid="335747957734796689">"Per suprimir aplicacions i dades, elimina l\'usuari convidat"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"SUPRIMEIX EL CONVIDAT"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Tanca la sessió de l\'usuari"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"TANCA LA SESSIÓ DE L\'USUARI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Vols afegir un usuari nou?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar-se l\'espai.\n\nQualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Estalvi de bateria activada"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Enhorabona! El Configurador de la IU del sistema s\'ha afegit a Configuració."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Treu de Configuració"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vols treure el Configurador de la UI del sistema de Configuració i deixar d\'utilitzar-ne totes les funcions?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index ee44e63e751d..4cacce1c3bd0 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -348,12 +348,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Host"</string> <string name="guest_notification_text" msgid="335747957734796689">"Chcete-li smazat aplikace a data, odeberte hosta"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRANIT HOSTA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Odhlásit uživatele"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ODHLÁSIT UŽIVATELE"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Přidat nového uživatele?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Když přidáte nového uživatele, musí si nastavit vlastní prostor.\n\nJakýkoli uživatel může aktualizovat aplikace všech ostatních uživatelů."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Režim Úspora baterie je zapnutý."</string> @@ -436,4 +434,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Úspěch! Do Nastavení byl přidán nástroj na ladění uživatelského rozhraní systému."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Odstranit z Nastavení"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Chcete nástroj na ladění uživatelského rozhraní systému odstranit z Nastavení a přestat používat všechny jeho funkce?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 475ef3fefa43..4d8b5c1baf5f 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gæstebruger"</string> <string name="guest_notification_text" msgid="335747957734796689">"Fjern gæstebrugeren for at slette apps og data"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJERN GÆST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Log brugeren ud"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOG BRUGEREN UD"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Vil du tilføje den nye bruger?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparefunktion er slået til"</string> @@ -426,10 +424,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Arbejdsprofil"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Sjovt for nogle, men ikke for alle"</string> - <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner giver dig flere muligheder for at justere og tilpasse Android-brugerfladen. Disse eksperimentelle funktioner kan ændre sig, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> - <string name="tuner_persistent_warning" msgid="8597333795565621795">"Disse eksperimentelle funktioner kan ændre sig, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner giver dig flere muligheder for at justere og tilpasse Android-brugerfladen. Disse eksperimentelle funktioner kan ændres, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Disse eksperimentelle funktioner kan ændres, gå i stykker eller forsvinde i fremtidige udgivelser. Vær forsigtig, hvis du fortsætter."</string> <string name="got_it" msgid="2239653834387972602">"OK"</string> <string name="tuner_toast" msgid="603429811084428439">"System UI Tuner blev føjet til Indstillinger"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Fjern fra Indstillinger"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vil du fjerne System UI Tuner fra Indstillinger og stoppe med at bruge alle dens funktioner?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 9da2cd77faa4..409af6cdb986 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gastnutzer"</string> <string name="guest_notification_text" msgid="335747957734796689">"Zum Löschen von Apps und Daten Gastnutzer entfernen"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"Gast entfernen"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Nutzer abmelden"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"Nutzer abmelden"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Neuen Nutzer hinzufügen?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wenn Sie einen neuen Nutzer hinzufügen, muss dieser seinen Bereich einrichten.\n\nJeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Energiesparmodus ist aktiviert"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Herzlichen Glückwunsch! System UI Tuner wurde \"Einstellungen\" hinzugefügt."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Aus \"Einstellungen\" entfernen"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner aus \"Einstellungen\" entfernen und die Verwendung von allen zugehörigen Funktionen beenden?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index d816e268902e..bf88459e4a4a 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Χρήστης-επισκέπτης"</string> <string name="guest_notification_text" msgid="335747957734796689">"Για διαγρ. εφαρμ. και δεδομένων, καταργ. το χρήστη-επισκέπτη"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ΚΑΤΑΡΓΗΣΗ ΕΠΙΣΚΕΠΤΗ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Αποσύνδεση χρήστη"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ΑΠΟΣΥΝΔΕΣΗ ΧΡΗΣΤΗ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Προσθήκη νέου χρήστη;"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Συγχαρητήρια! Το System UI Tuner προστέθηκε στις Ρυθμίσεις"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Κατάργηση από τις Ρυθμίσεις"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Κατάργηση System UI Tuner από τις Ρυθμίσεις και διακοπή χρήσης όλων των λειτουργιών του;"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index d00760c0bbd9..af7328e48dc2 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> <string name="guest_notification_text" msgid="335747957734796689">"To delete apps and data, remove guest user"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Logout user"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index d00760c0bbd9..af7328e48dc2 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> <string name="guest_notification_text" msgid="335747957734796689">"To delete apps and data, remove guest user"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Logout user"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index d00760c0bbd9..af7328e48dc2 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> <string name="guest_notification_text" msgid="335747957734796689">"To delete apps and data, remove guest user"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Logout user"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 01e815cdb657..56c7c6a0bec3 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario invitado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para borrar aplicaciones y datos, quita el usuario invitado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"QUITAR INVITADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Salir de la sesión del usuario"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"SALIR DE SESIÓN DEL USUARIO"</string> <string name="user_add_user_title" msgid="4553596395824132638">"¿Agregar usuario nuevo?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Cuando agregas un nuevo usuario, esa persona debe configurar su espacio.\n\nCualquier usuario puede actualizar aplicaciones para todos los usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> @@ -406,7 +404,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar el original."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string> - <string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador de IU del sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaje de la batería integrada"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentaje del nivel de batería en el ícono de la barra de estado cuando no se está cargando"</string> <string name="quick_settings" msgid="10042998191725428">"Configuración rápida"</string> @@ -428,10 +426,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de trabajo"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión para algunos, pero no para todos"</string> - <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner te brinda más formas para editar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, dejar de funcionar o no incluirse en futuras versiones. Procede con precaución."</string> + <string name="tuner_warning" msgid="8730648121973575701">"El sintonizador de IU del sistema te brinda más formas para editar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, dejar de funcionar o no incluirse en futuras versiones. Procede con precaución."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funciones experimentales pueden cambiar, dejar de funcionar o no incluirse en futuras versiones. Procede con precaución."</string> <string name="got_it" msgid="2239653834387972602">"Entendido"</string> - <string name="tuner_toast" msgid="603429811084428439">"Se agregó System UI Tuner a Configuración"</string> + <string name="tuner_toast" msgid="603429811084428439">"Se agregó el sintonizador de IU del sistema a Configuración"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Quitar de Configuración"</string> - <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Quieres quitar System UI Tuner de Configuración y dejar de utilizar todas sus funciones?"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Quieres quitar el sintonizador de IU del sistema de Configuración y dejar de utilizar todas sus funciones?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 0e4b80c76fcf..db34f7ee1665 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario invitado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para eliminar aplicaciones y datos, quita usuario invitado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ELIMINAR INVITADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Salir de usuario"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"SALIR DE USUARIO"</string> <string name="user_add_user_title" msgid="4553596395824132638">"¿Añadir nuevo usuario?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Al añadir un usuario nuevo, este debe configurar su espacio.\n\nCualquier usuario puede actualizar las aplicaciones del resto de usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"¡Enhorabuena! El configurador de IU del sistema se ha añadido a Ajustes"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Eliminar de Ajustes"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"¿Eliminar el configurador de IU del sistema de Ajustes y dejar de utilizar sus funciones?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index b4cb110be92c..e04bb8b0b02d 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Külaliskasutaja"</string> <string name="guest_notification_text" msgid="335747957734796689">"Rakenduste ja andmete kustutamiseks eemaldage külaliskasutaja"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"EEMALDA KÜLALINE"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Kasutaja väljalogimine"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGI KASUTAJA VÄLJA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Kas lisada uus kasutaja?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi.\n\nIga kasutaja saab värskendada rakendusi kõigi kasutajate jaoks."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akusäästja on sisse lülitatud"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Õnnitleme! Süsteemi kasutajaliidese tuuner lisati seadetesse"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Eemalda seadetest"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Kas eemaldada seadetest süsteemi kasutajaliidese tuuner ja lõpetada kõikide selle funktsioonide kasutamine?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 1352497919e0..fd8f462234ec 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Erabiltzaile gonbidatua"</string> <string name="guest_notification_text" msgid="335747957734796689">"Aplikazioak eta datuak ezabatzeko, kendu gonbidatua"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"KENDU GONBIDATUA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Amaitu erabiltzailearen saioa"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"AMAITU ERABILTZAILEAREN SAIOA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string> @@ -429,7 +427,9 @@ <string name="tuner_warning" msgid="8730648121973575701">"Sistemako erabiltzaile-interfazearen konfiguratzaileak Android erabiltzaile-interfazea moldatzeko eta pertsonalizatzeko modu gehiago eskaintzen dizkizu. Baliteke eginbide esperimental horiek hurrengo kaleratzeetan aldatuta, etenda edo desagertuta egotea. Kontuz erabili."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Baliteke eginbide esperimental horiek hurrengo kaleratzeetan aldatuta, etenda edo desagertuta egotea. Kontuz erabili."</string> <string name="got_it" msgid="2239653834387972602">"Ados"</string> - <string name="tuner_toast" msgid="603429811084428439">"Zorionak! Sistemako erabiltzaile-interfazearen konfiguratzailea ezarpenetan gehitu da"</string> - <string name="remove_from_settings" msgid="8389591916603406378">"Kendu ezarpenetatik"</string> - <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Sistemako erabiltzaile-interfazearen konfiguratzailea ezarpenetatik kendu nahi duzu, eta haren ezaugarri guztiak erabiltzeari utzi nahi diozu?"</string> + <string name="tuner_toast" msgid="603429811084428439">"Zorionak! Sistemako erabiltzaile-interfazearen konfiguratzailea Ezarpenak atalean gehitu da"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Kendu Ezarpenak ataletik"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Sistemako erabiltzaile-interfazearen konfiguratzailea ezarpenetatik kendu nahi duzu, eta haren eginbide guztiak erabiltzeari utzi nahi diozu?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index c40891385da9..d68704cf50c8 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"کاربر مهمان"</string> <string name="guest_notification_text" msgid="335747957734796689">"برای حذف برنامهها و دادهها، کاربر مهمان را حذف کنید"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"حذف مهمان"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"خروج کاربر از سیستم"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"خروج کاربر از سیستم"</string> <string name="user_add_user_title" msgid="4553596395824132638">"کاربر جدیدی اضافه میکنید؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"وقتی کاربر جدیدی را اضافه میکنید آن فرد باید فضای خودش را تنظیم کند.\n\nهر کاربری میتواند برنامهها را برای همه کاربران دیگر بهروزرسانی کند."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ذخیره کننده باتری روشن است."</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"تبریک میگوییم! «تنظیمکننده واسط کاربری سیستم» به «تنظیمات» اضافه شد"</string> <string name="remove_from_settings" msgid="8389591916603406378">"حذف از تنظیمات"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"«تنظیمکننده واسط کاربری سیستم» از تنظیمات حذف شود و همه ویژگیهای آن متوقف شوند؟"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 93edbe1b40e7..0e25d66b5687 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Vierailijakäyttäjä"</string> <string name="guest_notification_text" msgid="335747957734796689">"Poista sovellukset ja tiedot poistamalla vieraskäyttäjä."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"POISTA VIERAILIJA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Kirjaa käyttäjä ulos"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"KIRJAA KÄYTTÄJÄ ULOS"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Lisätäänkö uusi käyttäjä?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Virransäästö on käytössä"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Hienoa! System UI Tuner on nyt lisätty Asetuksiin."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Poista Asetuksista"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Haluatko poistaa System UI Tunerin Asetuksista ja lopettaa sen ominaisuuksien käytön?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a1f2b1c7141d..5f9489dfb932 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Utilisateur invité"</string> <string name="guest_notification_text" msgid="335747957734796689">"Pour supprimer des applications et des données, retirez l\'utilisateur invité"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"RETIRER L\'INVITÉ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Déconnecter l\'utilisateur"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DÉCONNECTER L\'UTILISATEUR"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"La fonction Économie d\'énergie est activée"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Félicitations! System UI Tuner a bien été ajouté aux paramètres."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Supprimer des paramètres"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Supprimer « System UI Tuner » des paramètres et arrêter d\'utiliser toutes ses fonctionnalités?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 44b112ec8bc2..e25090e20cc5 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Invité"</string> <string name="guest_notification_text" msgid="335747957734796689">"Pour supprimer des applis et des données, retirez l\'invité."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"RETIRER L\'INVITÉ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Déconnecter l\'utilisateur"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DÉCONNECTER L\'UTILISATEUR"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"L\'économiseur de batterie est activé"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Félicitations ! System UI Tuner a bien été ajouté aux paramètres."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Supprimer l\'outil des paramètres"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Supprimer System UI Tuner des paramètres et arrêter d\'utiliser toutes ses fonctionnalités ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 98804b536927..585b1ac45718 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuario convidado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para eliminar aplicacións e datos, elimina usuario invitado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"QUITAR CONVIDADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Pechar sesión do usuario"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"PECHAR SESIÓN DO USUARIO"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Engadir un usuario novo?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"O aforro de batería está activado"</string> @@ -406,7 +404,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é o cadro de diálogo de volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar o orixinal."</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando o perfil de traballo"</string> - <string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador da IU do sistema"</string> + <string name="system_ui_tuner" msgid="708224127392452018">"Configurador da IU do sistema"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"Mostrar porcentaxe de batería inserida"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Mostrar porcentaxe do nivel de batería na icona da barra de estado cando non está en carga"</string> <string name="quick_settings" msgid="10042998191725428">"Configuración rápida"</string> @@ -428,10 +426,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Zona wifi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Perfil de traballo"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Diversión só para algúns"</string> - <string name="tuner_warning" msgid="8730648121973575701">"O sintonizador da IU do sistema fornéceche formas adicionais de modificar e personalizar a interface de usuario de Android. Estas funcións experimentais poden cambiar, interromperse ou desaparecer en futuras versións. Continúa con precaución."</string> + <string name="tuner_warning" msgid="8730648121973575701">"O configurador da IU do sistema ofréceche formas adicionais de modificar e personalizar a interface de usuario de Android. Estas funcións experimentais poden cambiar, interromperse ou desaparecer en futuras versións. Continúa con precaución."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Estas funcións experimentais poden cambiar, interromperse ou desaparecer en futuras versións. Continúa con precaución."</string> <string name="got_it" msgid="2239653834387972602">"De acordo"</string> - <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O sintonizador da IU do sistema engadiuse a Configuración"</string> - <string name="remove_from_settings" msgid="8389591916603406378">"Eliminar da configuración"</string> - <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Queres eliminar da configuración o sintonizador da IU do sistema e deixar de usar todas as súas funcións?"</string> + <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O configurador da IU do sistema engadiuse a Configuración"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"Eliminar da Configuración"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Queres eliminar o configurador da IU do sistema da Configuración e deixar de usar todas as súas funcións?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 43d53725d313..a5b45ca0d8e5 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"અતિથિ વપરાશકર્તા"</string> <string name="guest_notification_text" msgid="335747957734796689">"એપ્લિકેશનો અને ડેટા કાઢી નાખવા, અતિથિ વપરાશકર્તાને દૂર કરો"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"અતિથિ દૂર કરો"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"વપરાશકર્તાને લૉગઆઉટ કરો"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"વપરાશકર્તાને લૉગઆઉટ કરો"</string> <string name="user_add_user_title" msgid="4553596395824132638">"નવા વપરાશકર્તાને ઉમેરીએ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"બેટરી સેવર ચાલુ છે"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"અભિનંદન! સિસ્ટમ UI ટ્યૂનરને સેટિંગ્સમાં ઉમેરવામાં આવ્યું છે"</string> <string name="remove_from_settings" msgid="8389591916603406378">"સેટિંગ્સમાંથી દૂર કરો"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"સેટિંગ્સમાંથી સિસ્ટમ UI ટ્યૂનર દૂર કરી અને તેની તમામ સુવિધાઓનો ઉપયોગ કરવાનું બંધ કરીએ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 323ebfaa6685..348eca065c92 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथि उपयोगकर्ता"</string> <string name="guest_notification_text" msgid="335747957734796689">"ऐप्स और डेटा हटाने के लिए, अतिथि उपयोगकर्ता को निकालें"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"अतिथि को निकालें"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"उपयोगकर्ता को प्रस्थान करवाना"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"उपयोगकर्ता को प्रस्थान करवाएं"</string> <string name="user_add_user_title" msgid="4553596395824132638">"नया उपयोगकर्ता जोड़ें?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपना स्थान सेट करना होता है.\n\nकोई भी उपयोगकर्ता अन्य सभी उपयोगकर्ताओं के लिए ऐप्स अपडेट कर सकता है."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"बधाई हो! सिस्टम UI ट्यूनर को सेटिंग में जोड़ दिया गया है"</string> <string name="remove_from_settings" msgid="8389591916603406378">"सेटिंग से निकालें"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"सेटिंग से सिस्टम UI ट्यूनर निकालें और इसकी सभी सुविधाओं का उपयोग रोक दें?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index f4bd452c4224..4b7f1cf4cb01 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -345,12 +345,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gostujući korisnik"</string> <string name="guest_notification_text" msgid="335747957734796689">"Da biste izbrisali aplikacije i podatke, uklonite gostujućeg korisnika"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"UKLONI GOSTA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Odjava korisnika"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ODJAVI KORISNIKA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Dodati novog korisnika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor.\n\nBilo koji korisnik može ažurirati aplikacije za sve ostale korisnike."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Štednja baterije je uključena"</string> @@ -433,4 +431,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Čestitamo! Ugađanje korisničkog sučelja sustava dodano je u Postavke"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Ukloni iz Postavki"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Želite li ukloniti Ugađanje korisničkog sučelja sustava iz Postavki i prestati upotrebljavati njegove značajke?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 3eb0fa666cfc..0697bba99ebf 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Vendég felhasználó"</string> <string name="guest_notification_text" msgid="335747957734796689">"Távolítsa el a vendéget az alkalmazások és adatok törléséhez"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"VENDÉG ELTÁVOLÍTÁSA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Felhasználó kijelentkezése"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"FELHASZNÁLÓ KIJELENTKEZÉSE"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Új felhasználó hozzáadása?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját tárterületét.\n\nBármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Gratulálunk! A Kezelőfelület-hangolót hozzáadtuk a Beállításokhoz"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Eltávolítás a Beállítások közül"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Eltávolítja a Kezelőfelület-hangolót a Beállításokból, és nem használja tovább egyik funkcióját sem?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index db0046a4c3ab..95e863494af6 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Հյուր"</string> <string name="guest_notification_text" msgid="335747957734796689">"Հավելվածները և տվյալները ջնջելու համար հեռացրեք հյուրին"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ՀԵՌԱՑՆԵԼ ՀՅՈՒՐԻՆ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Ընթացիկ օգտվողի դուրս գրում"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ԸՆԹԱՑԻԿ ՕԳՏՎՈՂԻ ԴՈՒՐՍ ԳՐՈՒՄ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր պրոֆիլ:"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Համակարգի ՕՄ-ի կարգավորիչը ավելացվել է կարգավորումներին"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Հեռացնել կարգավորումներից"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Հեռացնե՞լ Համակարգի ՕՄ-ի կարգավորիչը կարգավորումներից և չօգտվել այլևս նրա գործառույթներից:"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 688572572641..02e0d6b5fe5f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Pengguna tamu"</string> <string name="guest_notification_text" msgid="335747957734796689">"Untuk menghapus aplikasi dan data, hapus pengguna tamu"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"HAPUS TAMU"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Mengeluarkan pengguna"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"KELUARKAN PENGGUNA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Tambahkan pengguna baru?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri.\n\n1Pengguna mana pun dapat memperbarui aplikasi untuk semua pengguna lain."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Penghemat baterai aktif"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Selamat! Penyetel Antarmuka Pengguna Sistem telah ditambahkan ke Setelan"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Hapus dari Setelan"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Hapus Penyetel Antarmuka Pengguna Sistem dari Setelan dan berhenti menggunakan semua fiturnya?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index fc6ae658afd6..73ba5e242582 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gestanotandi"</string> <string name="guest_notification_text" msgid="335747957734796689">"Til að eyða forritum og gögnum skal eyða gestanotanda"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJARLÆGJA GEST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Skrá notanda út"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"SKRÁ NOTANDA ÚT"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Bæta nýjum notanda við?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Þegar þú bætir nýjum notanda við þarf sá notandi að setja upp svæðið sitt.\n\nHvaða notandi sem er getur uppfært forrit fyrir alla aðra notendur."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Kveikt er á rafhlöðusparnaði"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Til hamingju! Fínstillingum kerfisviðmóts hefur verið bætt við stillingar"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Fjarlægja úr stillingum"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Viltu fjarlægja fínstillingar kerfisviðmóts úr stillingum og hætta að nota eiginleika þeirra?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index c72e2e7758ea..ac8ffad07f61 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Utente ospite"</string> <string name="guest_notification_text" msgid="335747957734796689">"Per eliminare app e dati, rimuovi l\'utente ospite"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"RIMUOVI OSPITE"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Disconnessione utente"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DISCONNETTI UTENTE"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Aggiungere un nuovo utente?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Il nuovo utente, una volta aggiunto, deve impostare il proprio spazio.\n\nQualsiasi utente può aggiornare le app per tutti gli altri."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Risparmio batteria attivo"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Complimenti! Il sintetizzatore interfaccia utente di sistema è stato aggiunto alle impostazioni."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Rimuovi dalle impostazioni"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vuoi rimuovere il sintetizzatore interfaccia utente di sistema dalle impostazioni e smettere di utilizzare tutte le sue funzioni?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index d3a288146487..da3eff8fba73 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"משתמש אורח"</string> <string name="guest_notification_text" msgid="335747957734796689">"הסר את המשתמש האורח כדי למחוק אפליקציות ונתונים"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"הסר אורח"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ניתוק משתמש"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"נתק משתמש"</string> <string name="user_add_user_title" msgid="4553596395824132638">"האם להוסיף משתמש חדש?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"תכונת \'חיסכון בסוללה\' פועלת"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! System UI Tuner נוסף ל\'הגדרות\'"</string> <string name="remove_from_settings" msgid="8389591916603406378">"הסר מההגדרות"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index dd148e32b25e..d704e80e46d8 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ゲストユーザー"</string> <string name="guest_notification_text" msgid="335747957734796689">"アプリとデータを削除するには、ゲストユーザーを削除します"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ゲストを削除"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ユーザーのログアウト"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ユーザーをログアウト"</string> <string name="user_add_user_title" msgid="4553596395824132638">"新しいユーザーを追加しますか?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。\n\nすべてのユーザーは他のユーザーに代わってアプリを更新できます。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"バッテリーセーバーがON"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"システムUI調整ツールを設定に追加しました"</string> <string name="remove_from_settings" msgid="8389591916603406378">"設定から削除"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"設定からシステムUI調整ツールを削除して、全機能の使用を停止しますか?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index f24263b278ab..3ddb3eb69331 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"სტუმარი მომხმარებელი"</string> <string name="guest_notification_text" msgid="335747957734796689">"აპებისა და მონაცემების წასაშლელად ამოშალეთ სტუმარი"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"სტუმრის ამოშლა"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"მომხმარებლის გასვლა"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"მომხმარებლის გასვლა"</string> <string name="user_add_user_title" msgid="4553596395824132638">"დაემატოს ახალი მომხმარებელი?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს.\n\nნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ბატარეის დამზოგი ჩართულია"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"გილოცავთ! სისტემის UI ტუნერი დაემატა პარამეტრებს"</string> <string name="remove_from_settings" msgid="8389591916603406378">"პარამეტრებიდან წაშლა"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"გსურთ სისტემის UI ტუნერის პარამეტრებიდან წაშლა და მისი ყველა ფუნქციის გამოყენების შეწყვეტა?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index bdfb7da0f32c..d39c88e4e5d5 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Қонақ пайдаланушы"</string> <string name="guest_notification_text" msgid="335747957734796689">"Қолданбалар мен деректерді жою үшін, қонақ пайдаланушыны алып тастаңыз"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ҚОНАҚТЫ КЕТІРУ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Пайдаланушыны шығару"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ПАЙДАЛАНУШЫНЫ ШЫҒАРУ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Жаңа пайд-ны қосу керек пе?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңа пайдаланушыны қосқанда сол адам өз кеңістігін реттеуі керек.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батарея үнемдегіш қосулы"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Құттықтаймыз! Жүйелік пайдаланушылық интерфейс тюнері \"Параметрлер\" тармағына қосылды"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Параметрлерден жою"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Жүйелік пайдаланушылық интерфейс тюнерін \"Параметрлер\" тармағынан жойып, оның барлық мүмкіндіктерін пайдалануды тоқтату керек пе?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 465471bad703..aeeb75bbb8fa 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"អ្នកប្រើភ្ញៀវ"</string> <string name="guest_notification_text" msgid="335747957734796689">"ដើម្បីលុបកម្មវិធី និងទិន្នន័យ សូមយកអ្នកប្រើជាភ្ញៀវចេញ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"យកភ្ញៀវចេញ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ចុះឈ្មោះអ្នកប្រើចេញ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ចុះឈ្មោះអ្នកប្រើចេញ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"បន្ថែមអ្នកប្រើថ្មី?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ពេលអ្នកបន្ថែមអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវកំណត់ទំហំផ្ទាល់របស់គេ។\n\nអ្នកប្រើណាមួយក៏អាចធ្វើបច្ចុប្បន្នភាពកម្មវិធីសម្រាប់អ្នកប្រើផ្សេងបានដែរ។"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"កម្មវិធីសន្សំថ្មគឺបើក"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"សូមអបអរសាទរ! កម្មវិធីសម្រួល UI ប្រព័ន្ធត្រូវបានបន្ថែមទៅការកំណត់ហើយ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"យកចេញពីការកំណត់"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"យកកម្មវិធីសម្រួល UI ប្រព័ន្ធចេញពីការកំណត់ ហើយឈប់ប្រើលក្ខណៈពិសេសរបស់វាទាំងអស់?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 17f837fe6113..67d56c7785e9 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ಅತಿಥಿ ಬಳಕೆದಾರ"</string> <string name="guest_notification_text" msgid="335747957734796689">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾ ಅಳಿಸಲು, ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ಔಟ್ ಮಾಡಿ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ಔಟ್ ಮಾಡಿ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನವೀಕರಿಸಬಹುದು."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ತೆಗೆದುಹಾಕಿ"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index c87337bc18dd..582dbfa51a14 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"게스트 사용자"</string> <string name="guest_notification_text" msgid="335747957734796689">"앱 및 데이터를 삭제하려면 게스트 사용자를 삭제하세요."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"게스트 삭제"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"사용자 로그아웃"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"사용자 로그아웃"</string> <string name="user_add_user_title" msgid="4553596395824132638">"새 사용자를 추가할까요?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"배터리 세이버 사용 중"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"축하합니다. 시스템 UI 튜너가 설정에 추가되었습니다."</string> <string name="remove_from_settings" msgid="8389591916603406378">"설정에서 삭제"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"시스템 UI 튜너를 설정에서 삭제하고 모든 관련 기능의 사용을 중지하시겠습니까?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index eb66861e14e5..fa001374f0f0 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -369,12 +369,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Конок колдонуучу"</string> <string name="guest_notification_text" msgid="335747957734796689">"Клднмлр ж-а дйндрды жок кылуу ү-н, конок колднчсн алып салңз"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"КОНОКТУ АЛЫП САЛУУ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Колдонуучуну тутумдан чыгаруу"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"КОЛДОНУУЧУНУ ТУТУМДАН ЧЫГАРУУ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Жаңы колдонуучу кошосузбу?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңы колдонуучу кошулганда, ал өз мейкиндигин түзүп алышы керек.\n\nКолдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батареяны үнөмдөгүч күйгүзүлдү"</string> @@ -451,10 +449,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Туташуу чекити"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Жумуш профили"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Баарына эле жага бербейт"</string> - <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner Android колдонуучу интерфейсин жөнгө салып жана ыңгайлаштыруунун кошумча ыкмаларын камсыз кылат. Бул сынамык функциялар келечектеги чыгарылыштарда өзгөрүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> - <string name="tuner_persistent_warning" msgid="8597333795565621795">"Бул сынамык функциялар келечектеги чыгарылыштарда өзгөрүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner Android колдонуучу интерфейсин жөнгө салып жана ыңгайлаштыруунун кошумча ыкмаларын сунуштайт. Бул сынамык функциялар кийинки чыгарылыштарда өзгөрүлүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"Бул сынамык функциялар кийинки чыгарылыштарда өзгөрүлүп, бузулуп же жоголуп кетиши мүмкүн. Абайлап колдонуңуз."</string> <string name="got_it" msgid="2239653834387972602">"Түшүндүм"</string> <string name="tuner_toast" msgid="603429811084428439">"Куттуктайбыз! Жөндөөлөргө System UI Tuner кошулду"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Жөндөөлөрдөн алып салуу"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Жөндөөлөрдөн алынып салынып, анын бардык функциялары токтотулсунбу?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 789150c46eea..bcafb6f09b1a 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ຜູ້ໃຊ້ແຂກ"</string> <string name="guest_notification_text" msgid="335747957734796689">"ເພື່ອລຶບແອັບ ແລະຂໍ້ມູນ, ໃຫ້ເອົາຜູ້ໃຊ້ທີ່ເປັນແຂກອອກ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ເອົາແຂກອອກ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ເພີ່ມຜູ່ໃຊ້ໃໝ່ບໍ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ່ໃຊ້ໃໝ່, ຜູ່ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ່ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ່ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີແລ້ວ"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"ຍິນດີດ້ວຍ! System UI Tuner ໄດ້ຖືກເພີ່ມໃສ່ການຕັ້ງຄ່າແລ້ວ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ເອົາອອກຈາກການຕັ້ງຄ່າ"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ເອົາ System UI Tuner ອອກຈາກການຕັ້ງຄ່າ ແລະຢຸດການໃຊ້ທຸກຄຸນສົມບັດໃຊ້ງານຂອງມັນ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index f12cadb0cb7b..03898deaafd1 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Naudotojas svečias"</string> <string name="guest_notification_text" msgid="335747957734796689">"Kad būtų ištr. programos ir duom., pašal. naudotoją svečią"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"PAŠALINTI SVEČIĄ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Naudotojo atjungimas"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ATJUNGTI NAUDOTOJĄ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Pridėti naują naudotoją?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo erdvę.\n\nBet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akumuliatoriaus tausojimo priemonė įjungta"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Sveikiname! Sistemos naudotojo sąsajos derinimo priemonė pridėta prie nustatymų"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Pašalinti iš nustatymų"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Ar norite pašalinti sistemos naudotojo sąsajos derinimo priemonę iš nustatymų ir nebenaudoti jokių jos funkcijų?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 53a2634b0934..b5863fc29013 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -345,12 +345,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Vieslietotājs"</string> <string name="guest_notification_text" msgid="335747957734796689">"Lai dzēstu lietotnes un datus, noņemiet vieslietotāju."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"NOŅEMT VIESI"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Lietotāja atteikšana"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ATTEIKT LIETOTĀJU"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Vai pievienot jaunu lietotāju?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils.\n\nIkviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ieslēgts akumulatora enerģijas taupīšanas režīms"</string> @@ -433,4 +431,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Apsveicam! Sistēmas saskarnes regulators ir pievienots iestatījumiem."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Noņemt no iestatījumiem"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vai noņemt sistēmas saskarnes regulatoru no iestatījumiem un pārtraukt izmantot visas tā funkcijas?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 3665d4b691b2..467a0c89259f 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Корисник-гостин"</string> <string name="guest_notification_text" msgid="335747957734796689">"За да избришете апликации и податоци, отстранете го гостинот"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ОТСТРАНИ ГОСТИН"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Одјави го корисникот"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ОДЈАВИ ГО КОРИСНИКОТ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Да се додаде нов корисник?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Кога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Штедачот на батерија е вклучен"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Честито! Го додадовте Адаптерот на УИ на системот на Поставки"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Отстрани од поставки"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Да се отстрани Адаптерот на УИ на системот од Поставки и да престанат да се користат сите негови функции?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index 199ba248f210..9a5c3522ae7b 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"അതിഥി ഉപയോക്താവ്"</string> <string name="guest_notification_text" msgid="335747957734796689">"ആപ്സും വിവരങ്ങളും ഇല്ലാതാക്കാൻ അതിഥി ഉപയോക്താവിനെ നീക്കുക"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"അതിഥിയെ നീക്കംചെയ്യുക"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക"</string> <string name="user_add_user_title" msgid="4553596395824132638">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിയ്ക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്ഡേറ്റുചെയ്യാനാവും."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ബാറ്ററി സേവർ ഓണാണ്"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"അഭിനന്ദനങ്ങൾ! ക്രമീകരണത്തിലേക്ക് സിസ്റ്റം UI ട്യൂണർ ചേർത്തിരിക്കുന്നു"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ക്രമീകരണത്തിൽ നിന്ന് നീക്കംചെയ്യുക"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ക്രമീകരണത്തിൽ നിന്ന് സിസ്റ്റം UI ട്യൂണർ നീക്കംചെയ്യുകയും അതിന്റെ ഫീച്ചറുകളെല്ലാം ഉപയോഗിക്കുന്നത് നിർത്തുകയും ചെയ്യണോ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index fe29ee10e7cb..f6cca1a53cfc 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -342,12 +342,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Зочин хэрэглэгч"</string> <string name="guest_notification_text" msgid="335747957734796689">"Апп болон өгөгдлийг устгахын тулд зочин хэрэглэгчийг хасна уу"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ЗОЧНЫГ ГАРГАХ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Хэрэглэгчээс гарах"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ХЭРЭГЛЭГЧЭЭС ГАРАХ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Шинэ хэрэглэгч нэмэх үү?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Та шинэ хэрэглэгч нэмбэл, тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батерей хэмнэгч асаалттай"</string> @@ -430,4 +428,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Баяр хүргэе! Системийн UI Tохируулагчийг тохиргоонд нэмлээ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Тохиргооноос устгах"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Системийн UI Тохируулагчийг тохиргооноос устгаж, үүнтэй холбоотой бүх тохиргоог ашиглахаа болих уу?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 24ce9ae93726..c3b0bcd84874 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथी वापरकर्ता"</string> <string name="guest_notification_text" msgid="335747957734796689">"अॅप्स आणि डेटा हटविण्यासाठी, अतिथी वापरकर्ता काढा"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"अतिथी काढा"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"वापरकर्त्यास लॉगआउट करा"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"वापरकर्त्यास लॉगआउट करा"</string> <string name="user_add_user_title" msgid="4553596395824132638">"नवीन वापरकर्ता जोडायचा?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"आपण एक नवीन वापरकर्ता जोडता तेव्हा, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अद्यतनित करू शकतो."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"बॅटरी बचतकर्ता चालू आहे"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"अभिनंदन! सिस्टीम UI ट्यूनर सेटिंग्जमध्ये जोडले गेले आहे"</string> <string name="remove_from_settings" msgid="8389591916603406378">"सेटिंग्ज मधून काढा"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"सेटिंग्ज मधून सिस्टीम UI ट्यूनर काढून त्याची सर्व वैशिष्ट्ये वापरणे थांबवायचे?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 747d7ef238ae..61e8525f4ca9 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Pengguna tetamu"</string> <string name="guest_notification_text" msgid="335747957734796689">"Untuk memadamkan apl dan data, alih keluar pengguna tetamu"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ALIH KELUAR TETAMU"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Log keluar pengguna"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOG KELUAR PENGGUNA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Tambah pengguna baharu?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Apabila anda menambah pengguna baharu, orang itu perlu menyediakan ruang mereka.\n\nMana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Penjimat bateri dihidupkan"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Tahniah! Penala UI Sistem telah ditambahkan pada Tetapan"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Alih keluar daripada Tetapan"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Alih keluar Penala UI Sistem daripada Tetapan dan berhenti menggunakan semua cirinya?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index fd30fa8640e5..6763dac62983 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ဧည့်သည် အသုံးပြုသူ"</string> <string name="guest_notification_text" msgid="335747957734796689">"App များနှင့် ဒေတာအား ဖျက်ရန်၊ တခဏသုံးစွဲသူအား ဖယ်ရှားပါ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ဧည့်သည်ကို ဖယ်ထုတ်မည်"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"အသုံးပြုသူ ထွက်လိုက်ပါ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"အသုံးပြုသူ ထွက်လိုက်ပါ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"ဂုဏ်ပြုပါရစေ! စနစ် UI ဖမ်းစက်ကို ဆက်တင်ထဲသို့ ထည့်ပြီးပြီ။"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ဆက်တင် အထဲမှ ဖယ်ရှားရန်"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ဆက်တင် အထဲမှ စနစ် UI ဖမ်းစက်ကို ဖယ်ရှားလျက် ၎င်း၏ အင်္ဂါရပ်များ အားလုံး အသုံးပြုမှု ရပ်တန့်ရမလား?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 179bdb5a7e61..f45bd855d24e 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gjestebruker"</string> <string name="guest_notification_text" msgid="335747957734796689">"Fjern gjesten for å slette appene og dataene"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"FJERN GJEST"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Logg ut bruker"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGG UT BRUKER"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Vil du legge til en ny bruker?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparing er på"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Gratulerer! System UI Tuner er lagt til i Innstillinger"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Fjern fra Innstillinger"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vil du fjerne System UI Tuner fra Innstillinger og slutte å bruke alle de tilknyttede funksjonene?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 6c19b43d2501..059bfb24381a 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"अतिथि प्रयोगकर्ता"</string> <string name="guest_notification_text" msgid="335747957734796689">"अनुप्रयोगहरू र डेटा मेटाउन, अतिथि प्रयोगकर्ता हटाउनुहोस्"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"अतिथिलाई हटाउनुहोस्"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"प्रयोगकर्ता लगआउट गर्नुहोस्"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"प्रयोगकर्ता लगआउट गर्नुहोस्"</string> <string name="user_add_user_title" msgid="4553596395824132638">"नयाँ प्रयोगकर्ता थप्नुहुन्छ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ब्याट्रि सेभर चालु छ"</string> @@ -429,7 +427,9 @@ <string name="tuner_warning" msgid="8730648121973575701">"प्रणाली UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस अनुकूलन गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"यी प्रयोगात्मक सुविधाहरू भावी विमोचनहरूमा परिवर्तन हुन, बिग्रन वा हराउन सक्छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।"</string> <string name="got_it" msgid="2239653834387972602">"बुझेँ"</string> - <string name="tuner_toast" msgid="603429811084428439">"बधाइ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ"</string> + <string name="tuner_toast" msgid="603429811084428439">"बधाईँ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"सेटिङहरूबाट हटाउनुहोस्"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"प्रणाली UI ट्युनर सेटिङहरूबाट हटाउने र यसका सबै सुविधाहरू प्रयोग गर्न रोक्ने हो?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 3275b2ec8c53..a798618e07f5 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gastgebruiker"</string> <string name="guest_notification_text" msgid="335747957734796689">"Verwijder gastgebruiker om apps en gegevens te verwijderen"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"GAST VERWIJDEREN"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Gebruiker uitloggen"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"GEBRUIKER UITLOGGEN"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Nieuwe gebruiker toevoegen?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\n1Elke gebruiker kan apps updaten voor alle andere gebruikers."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Accubesparing is ingeschakeld"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Systeem-UI-tuner is toegevoegd aan Instellingen"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Verwijderen uit Instellingen"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Systeem-UI-tuner uit Instellingen verwijderen en het gebruik van alle functies daarvan stopzetten?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 8f4019f9ca80..6b86a59e3855 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ"</string> <string name="guest_notification_text" msgid="335747957734796689">"ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ ਹਟਾਓ"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ਮਹਿਮਾਨ ਨੂੰ ਹਟਾਓ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ਕੀ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਨਾ ਹੈ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਦੇ ਹੋ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣਾ ਸਪੇਸ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n\nਕੋਈ ਵੀ ਉਪਭੋਗਤਾ ਹੋਰ ਸਾਰੇ ਉਪਭੋਗਤਾਵਾਂ ਦੇ ਐਪਸ ਨੂੰ ਅਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"ਵਧਾਈਆਂ! ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਸੈਟਿੰਗਜ਼ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ ਹੈ"</string> <string name="remove_from_settings" msgid="8389591916603406378">"ਸੈਟਿੰਗਜ਼ ਤੋਂ ਹਟਾਓ"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ਕੀ ਸੈਟਿੰਗਜ਼ ਤੋਂ ਸਿਸਟਮ UI ਟਿਊਨਰ ਨੂੰ ਹਟਾਉਣਾ ਹੈ ਅਤੇ ਇਸਦੀਆਂ ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਉਪਯੋਗ ਕਰਨ ਤੋਂ ਰੋਕਣਾ ਹੈ?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 880221aff3ce..179c64400263 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gość"</string> <string name="guest_notification_text" msgid="335747957734796689">"Usuń gościa, by usunąć aplikacje i dane"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"USUŃ GOŚCIA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Wyloguj użytkownika"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"WYLOGUJ UŻYTKOWNIKA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Dodać nowego użytkownika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil.\n\nKażdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Oszczędzanie baterii jest włączone"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Gratulujemy, Kalibrator System UI został dodany do Ustawień"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Usuń z Ustawień"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Usunąć Kalibrator System UI z Ustawień i przestać używać wszystkich jego funkcji?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 87861c218c54..e62cc5f6ab64 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuário convidado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para excluir apps e dados, remova o usuário convidado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Desconectar usuário"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DESCONECTAR USUÁRIO"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O sintonizador System UI foi adicionado às configurações"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remover das configurações"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remover sintonizador System UI das configurações e parar de usar todos os seus recursos?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2e271788f137..2af76b31deac 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Utilizador convidado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para eliminar aplicações e dados, remover utiliz. convidado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Terminar sessão do utilizador"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"TERMINAR SESSÃO DO UTILIZADOR"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar um novo utilizador?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"A poupança de bateria está ligada"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O Sintonizador da interface do sistema foi adicionado às Definições"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remover das Definições"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Pretende remover o Sintonizador da interface do sistema das Definições e deixar de utilizar todas as respetivas funcionalidades?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 87861c218c54..e62cc5f6ab64 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Usuário convidado"</string> <string name="guest_notification_text" msgid="335747957734796689">"Para excluir apps e dados, remova o usuário convidado"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVER CONVIDADO"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Desconectar usuário"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DESCONECTAR USUÁRIO"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Parabéns! O sintonizador System UI foi adicionado às configurações"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Remover das configurações"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remover sintonizador System UI das configurações e parar de usar todos os seus recursos?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index b60e46fcf904..26bd0c625f7a 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -345,12 +345,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Utilizator oaspete"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ștergeți aplicații și date eliminând utilizatorul invitat"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ELIMINAȚI OASPETELE"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Deconectați utilizatorul"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"DECONECTAȚI UTILIZATORUL"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Adăugați utilizator nou?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Economisirea bateriei este activată"</string> @@ -433,4 +431,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Felicitări! System UI Tuner a fost adăugat în Setări"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Eliminați din Setări"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Eliminați System UI Tuner din Setări și încetați utilizarea tuturor funcțiilor sale?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index c9579b9c0131..a8013764eda0 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -348,12 +348,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Пользователь \"Гость\""</string> <string name="guest_notification_text" msgid="335747957734796689">"Чтобы стереть все приложения и данные, удалите аккаунт гостя."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"УДАЛИТЬ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Выход от имени пользователя"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ВЫЙТИ ОТ ИМЕНИ ПОЛЬЗОВАТЕЛЯ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Добавить пользователя?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"После создания профиля его необходимо настроить.\n\nОбновлять приложения для всех аккаунтов может любой пользователь устройства."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Включен режим энергосбережения"</string> @@ -436,4 +434,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Функция System UI Tuner добавлена в меню настроек"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Удалить из настроек"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Убрать функцию System UI Tuner из меню настроек и прекратить ее работу?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 831329420742..ce8228a5fecd 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ආගන්තුක පරිශිලකයා"</string> <string name="guest_notification_text" msgid="335747957734796689">"යෙදුම් සහ දත්ත මැකීමට, ආගන්තුක පරිශීලකයා ඉවත් කරන්න"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ආගන්තුකයා ඉවත් කරන්නද?"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"පරිශීලකයා වරනය කිරීම"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"පරිශීලකයා වරනය කරන්න"</string> <string name="user_add_user_title" msgid="4553596395824132638">"අලුත් පරිශීලකයෙක් එකතු කරන්නද?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ඔබ අලුත් පරිශීලකයෙක් එකතු කරන විට, එම පුද්ගලයා ඔහුගේ වැඩ කරන ඉඩ සකසා ගත යුතුය.\n\nසියළුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යාවත්කාලීන කළ හැක."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"බැටරිය සුරකින්නා සක්රීයයි"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"සුබ පැතුම්! පද්ධති UI සුසරකය සැකසීම් වෙත එක් කර ඇත"</string> <string name="remove_from_settings" msgid="8389591916603406378">"සැකසීම් වෙතින් ඉවත් කරන්න"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"සැකසීම් වෙතින් පද්ධති UI සුසරකය ඉවත් කර සහ එහි සියලු අංග භාවිතය නවත් වන්නද?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a0fd415a12c7..129ee99b6218 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -348,12 +348,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Hosť"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ak chcete odstrániť aplikácie a údaje, odstráňte hosťa."</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRÁNIŤ HOSŤA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Odhlásenie používateľa"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ODHLÁSIŤ POUŽÍVATEĽA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Pridať nového používateľa?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor.\n\nAkýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Šetrič batérie je zapnutý"</string> @@ -436,4 +434,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Výborne, tuner používateľského rozhrania systému bol pridaný do Nastavení"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Odstrániť z Nastavení"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Chcete odstrániť tuner používateľského rozhrania systému z Nastavení a prestať používať všetky jeho funkcie?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 89fdd2c783b7..7d1c3c1da763 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gost"</string> <string name="guest_notification_text" msgid="335747957734796689">"Če želite izbrisati aplikacije in podatke, odstranite gosta"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ODSTRANI GOSTA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Odjava uporabnika"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ODJAVA UPORABNIKA"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Dodajanje novega uporabnika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Varčevanje z energijo akumulatorja je vklopljeno"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Čestitke! Uglaševalnik uporabniškega vmesnika sistema je bil dodan v nastavitve."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Odstrani iz nastavitev"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Ali želite odstraniti Uglaševalnik uporabniškega vmesnika sistema iz nastavitev in prenehati uporabljati vse njegove funkcije?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index f095c17e1be8..8f284d405e0a 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Përdorues vizitor"</string> <string name="guest_notification_text" msgid="335747957734796689">"Për të fshirë aplikacionet dhe të dhënat, hiqe përdoruesin vizitor"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"HIQ VIZITORIN"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Nxirr përdororuesin nga identifikimi"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"NXJERRJA E PËRDORUESIT NGA IDENTIFIKIMI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Të shtohet përdorues i ri?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet.\n\nÇdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Kursimi i baterisë është i aktivizuar"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Urime! Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit u shtua te Cilësimet"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Hiqe nga Cilësimet"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Të hiqet Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit nga Cilësimet dhe të ndërpritet përdorimi i të gjitha funksioneve të tij?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index f8eadc2f8fb3..82a1db17404f 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -345,12 +345,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Гост"</string> <string name="guest_notification_text" msgid="335747957734796689">"Да бисте избрисали апликације и податке, уклоните госта"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"УКЛОНИ ГОСТА"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Одјављивање корисника"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ОДЈАВИ КОРИСНИКА"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Додајете новог корисника?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Када додате новог корисника, та особа треба да подеси сопствени простор.\n\nСваки корисник може да ажурира апликације за све остале кориснике."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Штедња батерије је укључена"</string> @@ -433,4 +431,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Честитамо! Тјунер за кориснички интерфејс система је додат у Подешавања"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Уклони из Подешавања"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Желите ли да уклоните Тјунер за кориснички интерфејс система из Подешавања и да престанете да користите све његове функције?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index bdef7e5f095d..5171b3ad2434 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Gästanvändare"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ta bort gästanvändaren om du vill radera appar och data"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"TA BORT GÄSTEN"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Logga ut användaren"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"LOGGA UT ANVÄNDAREN"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Lägga till ny användare?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme.\n\nAlla användare kan uppdatera appar för samtliga användares räkning."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparläget har aktiverats"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Grattis! Inställningar för systemgränssnitt har lagts till i inställningarna."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Ta bort från inställningarna"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Vill du ta bort inställningar för systemgränssnitt från inställningarna och sluta använda alla tillhörande funktioner?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index e88c3f1e3e7e..2c435bad99da 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Mtumiaji mgeni"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ili uweze kufuta programu na data, mwondoe mtumiaji aliyealikwa"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ONDOA MGENI"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Ondoa mtumiaji"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ONDOA MTUMIAJI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Unapomwongeza mtumiaji mpya, mtu huyo anahitaji kusanidi nafasi yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa ajili ya watumiaji wengine wote."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Kiokoa betri kimewashwa"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Hongera! Kipokea Ishara cha System UI kimeongezwa kwenye Mipangilio"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Ondoa kwenye Mipangilio"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Je, ungependa kuondoa Kipokea ishara cha SystemUI kwenye Mipangilio na uache kutumia vipengele vyake vyote?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 8436fa84fe76..1600017d11a1 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"அழைக்கப்பட்டவர்"</string> <string name="guest_notification_text" msgid="335747957734796689">"பயன்பாடுகளையும் தரவையும் நீக்க, விருந்தினர் பயனரை அகற்றவும்"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"அழைக்கப்பட்டவரை அகற்றவா?"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"பயனரை வெளியேற்று"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"பயனரை வெளியேற்று"</string> <string name="user_add_user_title" msgid="4553596395824132638">"புதியவரைச் சேர்க்கவா?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"பேட்டரி சேமிப்பான் இயக்கத்தில் உள்ளது"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"வாழ்த்துகள்! அமைப்புகளில் System UI Tuner சேர்க்கப்பட்டது"</string> <string name="remove_from_settings" msgid="8389591916603406378">"அமைப்புகளிலிருந்து அகற்று"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"அமைப்புகளிலிருந்து System UI Tunerஐ அகற்றிவிட்டு, அதன் எல்லா அம்சங்களையும் பயன்படுத்துவதை நிறுத்தவா?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index 5b7edbbacba3..c73c76aa67a8 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"అతిథి వినియోగదారు"</string> <string name="guest_notification_text" msgid="335747957734796689">"అనువర్తనాలు, డేటా తొలగించేందుకు అతిథి వినియోగదారు తీసివేయండి"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"అతిథిని తీసివేయి"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"వినియోగదారుని లాగ్ అవుట్ చేయండి"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"వినియోగదారుని లాగ్ అవుట్ చేయి"</string> <string name="user_add_user_title" msgid="4553596395824132638">"కొత్త వినియోగదారుని జోడించాలా?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"బ్యాటర్ సేవర్ ఆన్ చేయబడింది"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"అభినందనలు! సెట్టింగ్లకు సిస్టమ్ UI ట్యూనర్ జోడించబడింది"</string> <string name="remove_from_settings" msgid="8389591916603406378">"సెట్టింగ్ల నుండి తీసివేయి"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"సిస్టమ్ UI ట్యూనర్ను సెట్టింగ్ల నుండి తీసివేసి, దాని అన్ని లక్షణాలను ఉపయోగించడం ఆపివేయాలా?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 6c0a3eb864c6..2e51d78d5f99 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"ผู้ใช้ที่เป็นผู้เข้าร่วม"</string> <string name="guest_notification_text" msgid="335747957734796689">"หากต้องการลบแอปและข้อมูล ให้นำผู้ใช้ที่เป็นผู้เข้าร่วมออก"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"นำผู้เข้าร่วมออก"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"ออกจากระบบผู้ใช้"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ออกจากระบบผู้ใช้"</string> <string name="user_add_user_title" msgid="4553596395824132638">"ต้องการเพิ่มผู้ใช้ใหม่ใช่ไหม"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง\n\nผู้ใช้ทุกคนสามารถอัปเดตแอปสำหรับผู้ใช้รายอื่นทุกคนได้"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"ยินดีด้วย! เพิ่มตัวรับสัญญาณ UI ระบบไปยังการตั้งค่าแล้ว"</string> <string name="remove_from_settings" msgid="8389591916603406378">"นำออกจากการตั้งค่า"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้คุณลักษณะทั้งหมดของตัวรับสัญญาณใช่ไหม"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index aab0c2c67775..580ef4e95a79 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Bisitang user"</string> <string name="guest_notification_text" msgid="335747957734796689">"Upang mag-delete ng mga app at data, alisin ang bisitang user"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ALISIN ANG BISITA"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"I-logout ang user"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"I-LOGOUT ANG USER"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Magdagdag ng bagong user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo.\n\nAng sinumang user ay maaaring mag-update ng mga app para sa lahat ng iba pang user."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Binabati kita! Naidagdag na ang Tuner ng System UI sa Mga Setting"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Alisin sa Mga Setting"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Alisin ang Tuner ng System UI sa Mga Setting at ihinto ang paggamit ng lahat ng feature nito?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 06a9acac0cf3..6ab64fb186c9 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Misafir kullanıcı"</string> <string name="guest_notification_text" msgid="335747957734796689">"Uyg. ve verileri silmek için misafir kullanıcıyı kaldırın"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"MİSAFİR KALDIRILSIN MI?"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Kullanıcı oturumunu kapatın"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"KULLANICI OTURUMUNU KAPAT"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Yeni kullanıcı eklensin mi?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni bir kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir.\n\nHerhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Pil tasarrufu açık"</string> @@ -425,11 +423,13 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Hızlı Ayarlar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"İş profili"</string> - <string name="tuner_warning_title" msgid="7094689930793031682">"Bazıları eğlence içindir, ancak hepsi değil"</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Bazıları için eğlenceliyken diğerleri için olmayabilir"</string> <string name="tuner_warning" msgid="8730648121973575701">"Sistem Kullanıcı Arayüzü Ayarlayıcı, Android kullanıcı arayüzünde değişiklikler yapmanız ve arayüzü özelleştirmeniz için ekstra yollar sağlar. Bu deneysel özellikler değişebilir, bozulabilir veya gelecekteki sürümlerde yer almayabilir. Dikkatli bir şekilde devam edin."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Bu deneysel özellikler değişebilir, bozulabilir veya gelecekteki sürümlerde yer almayabilir. Dikkatli bir şekilde devam edin."</string> <string name="got_it" msgid="2239653834387972602">"Anladım"</string> <string name="tuner_toast" msgid="603429811084428439">"Tebrikler! Sistem Kullanıcı Arayüzü Ayarlayıcı Ayarlar\'a eklendi"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Ayarlar\'dan kaldır"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Sistem Kullanıcı Arayüzü Ayarlayıcısı Ayarlar\'dan kaldırılsın ve tüm özelliklerinin kullanılması durdurulsun mu?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index ecccddb166c4..5ff89453d2ed 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Режим гостя"</string> <string name="guest_notification_text" msgid="335747957734796689">"Щоб видалити додатки й дані, вилучіть профіль гостя"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"ВИЙТИ З РЕЖИМУ ГОСТЯ"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Вийти з облікового запису"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ВИЙТИ З ОБЛІКОВОГО ЗАПИСУ"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Додати нового користувача?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Користувач має налаштувати свій профіль після створення.\n\nБудь-який користувач пристрою може оновлювати додатки для решти користувачів."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Режим заощадження заряду акумулятора ввімкнено"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Вітаємо! System UI Tuner установлено в додатку Налаштування"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Видалити з додатка Налаштування"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Видалити інструмент System UI Tuner із додатка Налаштування та припинити користуватися всіма його функціями?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index ff87e520501b..27dda927c889 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"مہمان صارف"</string> <string name="guest_notification_text" msgid="335747957734796689">"ایپس اور ڈیٹا حذف کرنے کیلئے مہمان صارف کو ہٹائیں"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"مہمان کو ہٹائیں"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"صارف لاگ آؤٹ کریں"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"صارف لاگ آؤٹ کریں"</string> <string name="user_add_user_title" msgid="4553596395824132638">"نیا صارف شامل کریں؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string> @@ -404,8 +402,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> والیوم ڈائلاگ ہے"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"اصل کو بحال کرنے کیلئے ٹچ کریں۔"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"آپ اپنا دفتری پروفائل استعمال کر رہے ہیں۔"</string> - <!-- no translation found for system_ui_tuner (708224127392452018) --> - <skip /> + <string name="system_ui_tuner" msgid="708224127392452018">"سسٹم UI ٹیونر"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"سرایت کردہ بیٹری کی فیصد دکھائیں"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"جب چارج نہ ہو رہا ہو تو بیٹری کی سطح کی فیصد اسٹیٹس بار آئیکن کے اندر دکھائیں"</string> <string name="quick_settings" msgid="10042998191725428">"فوری ترتیبات"</string> @@ -426,18 +423,13 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"فوری ترتیبات، <xliff:g id="TITLE">%s</xliff:g>۔"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ہاٹ اسپاٹ"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"دفتری پروفائل"</string> - <!-- no translation found for tuner_warning_title (7094689930793031682) --> - <skip /> - <!-- no translation found for tuner_warning (8730648121973575701) --> - <skip /> - <!-- no translation found for tuner_persistent_warning (8597333795565621795) --> - <skip /> - <!-- no translation found for got_it (2239653834387972602) --> - <skip /> - <!-- no translation found for tuner_toast (603429811084428439) --> - <skip /> - <!-- no translation found for remove_from_settings (8389591916603406378) --> - <skip /> - <!-- no translation found for remove_from_settings_prompt (6069085993355887748) --> + <string name="tuner_warning_title" msgid="7094689930793031682">"کچھ کیلئے دلچسپ لیکن سبھی کیلئے نہیں"</string> + <string name="tuner_warning" msgid="8730648121973575701">"سسٹم UI ٹیونر Android صارف انٹر فیس میں ردوبدل کرنے اور اسے حسب ضرورت بنانے کیلئے آپ کو اضافی طریقے دیتا ہے۔ یہ تجرباتی خصوصیات مستقبل کی ریلیزز میں تبدیل ہو سکتی، رک سکتی یا غائب ہو سکتی ہیں۔ احتیاط کے ساتھ آگے بڑھیں۔"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"یہ تجرباتی خصوصیات مستقبل کی ریلیزز میں تبدیل ہو سکتی، رک سکتی یا غائب ہو سکتی ہیں۔ احتیاط کے ساتھ آگے بڑھیں۔"</string> + <string name="got_it" msgid="2239653834387972602">"سمجھ آ گئی"</string> + <string name="tuner_toast" msgid="603429811084428439">"مبارک ہو! سسٹم UI ٹیونر کو ترتیبات میں شامل کر دیا گیا ہے"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"ترتیبات سے ہٹائیں"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ترتیبات سے سسٹم UI ٹیونر کو ہٹائیں اور اس کی سبھی خصوصیات کا استعمال بند کریں؟"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index fda0482294a3..852564fffa04 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -130,8 +130,8 @@ <string name="accessibility_two_bars" msgid="6437363648385206679">"Ikkita ustun."</string> <string name="accessibility_three_bars" msgid="2648241415119396648">"Uchta ustun."</string> <string name="accessibility_signal_full" msgid="9122922886519676839">"Signal to‘liq."</string> - <string name="accessibility_desc_on" msgid="2385254693624345265">"Yoqilgan."</string> - <string name="accessibility_desc_off" msgid="6475508157786853157">"O‘chirilgan."</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"Yoniq"</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"O‘chiq"</string> <string name="accessibility_desc_connected" msgid="8366256693719499665">"Ulangan."</string> <string name="accessibility_desc_connecting" msgid="3812924520316280149">"Ulanmoqda…"</string> <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string> @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Mehmon foydalanuvchi"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ilova va ma’l-ni o‘chirish u-n mehmon hisobini o‘chiring"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"MEHMON HISOBINI O‘CHIRISH"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Foydalanuvchini tizimdan chiqaring"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"TIZIMDAN CHIQARISH"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Yangi foyd-chi qo‘shilsinmi?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yangi foydalanuvchi qo‘shilgach, o‘sha shaxs o‘z hududini sozlashi lozim bo‘ladi.\n\nHar qanday foydalanuvchi ilovalarni barcha foydalanuvchilar uchun yangilashi mumkin."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash rejimi yoqildi"</string> @@ -425,11 +423,13 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Tezkor sozlamalar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Ulanish nuqtasi"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Ishchi profil"</string> - <string name="tuner_warning_title" msgid="7094689930793031682">"Ayrimlarga yoqadi, boshqalarga esa yo‘q"</string> - <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner sizga Android foydalanuvchi interfeysini tuzatish va o‘zingizga moslashtirishingiz mumkin. Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> + <string name="tuner_warning_title" msgid="7094689930793031682">"Diqqat!"</string> + <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner yordamida siz Android foydalanuvchi interfeysini tuzatish va o‘zingizga moslashtirishingiz mumkin. Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> <string name="got_it" msgid="2239653834387972602">"OK"</string> <string name="tuner_toast" msgid="603429811084428439">"Tabriklaymiz! System UI Tuner Sozlamalarga qo‘shildi."</string> <string name="remove_from_settings" msgid="8389591916603406378">"Sozlamalardan olib tashlash"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"System UI Tuner Sozlamalardan olib tashlanib, uning barcha funksiyalaridan foydalanish to‘xtatilsinmi?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index ec3e5658ddf0..c60c83284347 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Người dùng khách"</string> <string name="guest_notification_text" msgid="335747957734796689">"Để xóa ứng dụng và dữ liệu, hãy xóa người dùng khách"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"XÓA KHÁCH"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Đăng xuất người dùng"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"ĐĂNG XUẤT NGƯỜI DÙNG"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Thêm người dùng mới?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Khi bạn thêm người dùng mới, người dùng đó cần thiết lập dung lượng lưu trữ của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Trình tiết kiệm pin đang bật"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Xin chúc mừng! Bộ điều hướng giao diện người dùng hệ thống đã được thêm vào Cài đặt"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Xóa khỏi Cài đặt"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Xóa Bộ điều hướng giao diện người dùng hệ thống khỏi Cài đặt và ngừng sử dụng tất cả tính năng của ứng dụng này?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 4f9eaa942fea..9cac80046f0d 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"访客用户"</string> <string name="guest_notification_text" msgid="335747957734796689">"要删除应用和数据,请退出访客用户身份"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除访客"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"退出当前用户"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"退出当前用户"</string> <string name="user_add_user_title" msgid="4553596395824132638">"要添加新用户吗?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"当您添加新用户时,该用户必须设置自己的空间。\n\n任何用户均可为其他所有用户更新应用。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"节电助手已开启"</string> @@ -406,8 +404,7 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已用作音量控制对话框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"触摸即可恢复原始设置。"</string> <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您当前正在使用工作资料"</string> - <!-- no translation found for system_ui_tuner (708224127392452018) --> - <skip /> + <string name="system_ui_tuner" msgid="708224127392452018">"系统界面调谐器"</string> <string name="show_battery_percentage" msgid="5444136600512968798">"嵌入式显示电池电量百分比 显示嵌入的电池电量百分比"</string> <string name="show_battery_percentage_summary" msgid="3215025775576786037">"未充电时在状态栏图标内显示电池电量百分比"</string> <string name="quick_settings" msgid="10042998191725428">"快速设置"</string> @@ -428,18 +425,13 @@ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"快速设置,<xliff:g id="TITLE">%s</xliff:g>。"</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"热点"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"工作资料"</string> - <!-- no translation found for tuner_warning_title (7094689930793031682) --> - <skip /> - <!-- no translation found for tuner_warning (8730648121973575701) --> - <skip /> - <!-- no translation found for tuner_persistent_warning (8597333795565621795) --> - <skip /> - <!-- no translation found for got_it (2239653834387972602) --> - <skip /> - <!-- no translation found for tuner_toast (603429811084428439) --> - <skip /> - <!-- no translation found for remove_from_settings (8389591916603406378) --> - <skip /> - <!-- no translation found for remove_from_settings_prompt (6069085993355887748) --> + <string name="tuner_warning_title" msgid="7094689930793031682">"是否有趣完全取决于个人感觉"</string> + <string name="tuner_warning" msgid="8730648121973575701">"系统界面调谐器可让您通过其他方式调整及自定义 Android 用户界面。在日后推出的版本中,这些实验性功能可能会变更、损坏或消失。操作时请务必谨慎。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"在日后推出的版本中,这些实验性功能可能会变更、损坏或消失。操作时请务必谨慎。"</string> + <string name="got_it" msgid="2239653834387972602">"知道了"</string> + <string name="tuner_toast" msgid="603429811084428439">"恭喜!系统界面调谐器已添加到“设置”中"</string> + <string name="remove_from_settings" msgid="8389591916603406378">"从“设置”中移除"</string> + <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要将系统界面调谐器从“设置”中移除,并停止使用所有相关功能吗?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 15b58e1d1179..2d9ebf02fddd 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"訪客使用者"</string> <string name="guest_notification_text" msgid="335747957734796689">"如要刪除應用程式和資料,請移除訪客使用者"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除訪客"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"登出使用者"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"登出使用者"</string> <string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為所有其他使用者更新應用程式。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string> @@ -428,10 +426,12 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"熱點"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"工作設定檔"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"這只是測試版本,並不包含完整功能"</string> - <string name="tuner_warning" msgid="8730648121973575701">"使用者介面調諧器讓您以更多方法修改和自訂 Android 使用者介面。但請小心,這些實驗功能可能會在日後發布時更改、分拆或消失。"</string> - <string name="tuner_persistent_warning" msgid="8597333795565621795">"請小心,這些實驗功能可能會在日後發布時更改、分拆或消失。"</string> + <string name="tuner_warning" msgid="8730648121973575701">"使用者介面調諧器讓您以更多方法修改和自訂 Android 使用者介面。但請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> + <string name="tuner_persistent_warning" msgid="8597333795565621795">"請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> <string name="got_it" msgid="2239653834387972602">"知道了"</string> <string name="tuner_toast" msgid="603429811084428439">"恭喜您!系統使用者介面調諧器已新增至「設定」中"</string> <string name="remove_from_settings" msgid="8389591916603406378">"從「設定」移除"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要從「設定」移除系統使用者介面調諧器,並停止其所有功能嗎?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 05fecd8ce459..1446db4aeb3e 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -346,12 +346,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"訪客使用者"</string> <string name="guest_notification_text" msgid="335747957734796689">"如要刪除應用程式和資料,請移除訪客使用者"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"移除訪客"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"登出使用者"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"登出使用者"</string> <string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者皆可為其他所有使用者更新應用程式。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string> @@ -434,4 +432,6 @@ <string name="tuner_toast" msgid="603429811084428439">"恭喜!系統使用者介面調整精靈已新增到設定中"</string> <string name="remove_from_settings" msgid="8389591916603406378">"從設定中移除"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"要將系統使用者介面調整精靈從設定中移除,並停止使用所有相關功能嗎?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 67e4911247e6..689852a1f307 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -344,12 +344,10 @@ <string name="guest_notification_title" msgid="1585278533840603063">"Umsebenzisi oyisihambeli"</string> <string name="guest_notification_text" msgid="335747957734796689">"Ukuze ususe izinhlelo zokusebenza nedatha, susa umsebenzisi oyisihambeli"</string> <string name="guest_notification_remove_action" msgid="8820670703892101990">"SUSA ISIHAMBELI"</string> - <!-- no translation found for user_logout_notification_title (1453960926437240727) --> - <skip /> - <!-- no translation found for user_logout_notification_text (6058349308204461080) --> - <skip /> - <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <string name="user_logout_notification_title" msgid="1453960926437240727">"Khipha umsebenzisi"</string> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> <skip /> + <string name="user_logout_notification_action" msgid="1195428991423425062">"KHIPHA UMSEBENZISI"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Engeza umsebenzisi omusha?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha isikhala sakhe.\n\nNoma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza kubo bonke abasebenzisi."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Isilondolozi sebhethri sivuliwe"</string> @@ -432,4 +430,6 @@ <string name="tuner_toast" msgid="603429811084428439">"Siyakuhalalisela! Isishuni se-UI sesistimu singeziwe kuzilungiselelo"</string> <string name="remove_from_settings" msgid="8389591916603406378">"Susa kusuka kuzilungiselelo"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"Susa isishuni se-UI yesistimu kusuka kuzilungiselelo futhi uyeke ukusebenzisa zonke izici zakhona?"</string> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index e392c1134d42..045bc4afa838 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -856,7 +856,7 @@ <string name="user_logout_notification_title">Logout user</string> <!-- Text of the notification shown to logout the current user [CHAR LIMIT=60] --> - <string name="user_logout_notification_text">To logout the current user, stop user applications.</string> + <string name="user_logout_notification_text">Logout current user</string> <!-- Logout action in the notification shown to logout the current user [CHAR LIMIT=30] --> <string name="user_logout_notification_action">LOGOUT USER</string> @@ -1129,4 +1129,7 @@ <!-- Dialog asking if the tuner should really be removed from settings [CHAR LIMIT=NONE]--> <string name="remove_from_settings_prompt">Remove System UI Tuner from Settings and stop using all of its features?"</string> + <!-- Displayed when user launches an app that was uninstalled [CHAR LIMIT=NONE] --> + <string name="activity_not_found">Application is not installed on your device</string> + </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 188986274e77..8241ddf6a378 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -206,6 +206,11 @@ <item name="android:windowExitAnimation">@*android:anim/shrink_fade_out_from_bottom</item> </style> + <style name="Animation.NavigationBarFadeIn"> + <item name="android:windowEnterAnimation">@anim/navbar_fade_in</item> + <item name="android:windowExitAnimation">@null</item> + </style> + <!-- Standard animations for hiding and showing the status bar. --> <style name="Animation.StatusBar"> </style> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 3f721256a25d..9eb768c51851 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -244,12 +244,12 @@ public class DozeLog { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { traceScreenOn(); } @Override - public void onScreenTurnedOff(int why) { + public void onFinishedGoingToSleep(int why) { traceScreenOff(why); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 9f21dbe7bb09..d78800ffe521 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -132,6 +132,18 @@ public class KeyguardService extends Service { } @Override // Binder interface + public void onScreenTurnedOn() { + checkPermission(); + mKeyguardViewMediator.onScreenTurnedOn(); + } + + @Override // Binder interface + public void onScreenTurnedOff() { + checkPermission(); + mKeyguardViewMediator.onScreenTurnedOff(); + } + + @Override // Binder interface public void setKeyguardEnabled(boolean enabled) { checkPermission(); mKeyguardViewMediator.setKeyguardEnabled(enabled); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 9f12afbb5e17..f0154a78d8d7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -41,7 +41,6 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -138,7 +137,7 @@ public class KeyguardViewMediator extends SystemUI { private static final int HIDE = 3; private static final int RESET = 4; private static final int VERIFY_UNLOCK = 5; - private static final int NOTIFY_SCREEN_OFF = 6; + private static final int NOTIFY_FINISHED_GOING_TO_SLEEP = 6; private static final int NOTIFY_SCREEN_TURNING_ON = 7; private static final int KEYGUARD_DONE = 9; private static final int KEYGUARD_DONE_DRAWING = 10; @@ -150,6 +149,8 @@ public class KeyguardViewMediator extends SystemUI { private static final int ON_ACTIVITY_DRAWN = 19; private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20; private static final int NOTIFY_STARTED_WAKING_UP = 21; + private static final int NOTIFY_SCREEN_TURNED_ON = 22; + private static final int NOTIFY_SCREEN_TURNED_OFF = 23; /** * The default amount of time we stay awake (used for all key input) @@ -467,12 +468,13 @@ public class KeyguardViewMediator extends SystemUI { mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(); } } else { - if (wakeAndUnlocking && unlockingWithFingerprintAllowed) { + if (wakeAndUnlocking && mShowing && unlockingWithFingerprintAllowed) { mWakeAndUnlocking = true; + mStatusBarKeyguardViewManager.setWakeAndUnlocking(); keyguardDone(true, true); - } else { + } else if (mShowing && mDeviceInteractive) { if (wakeAndUnlocking) { - mStatusBarKeyguardViewManager.notifyScreenWakeUpRequested(); + mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested(); } mStatusBarKeyguardViewManager.animateCollapsePanels( FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR); @@ -702,7 +704,7 @@ public class KeyguardViewMediator extends SystemUI { resetKeyguardDonePendingLocked(); mHideAnimationRun = false; - notifyScreenOffLocked(); + notifyFinishedGoingToSleep(); if (mPendingReset) { resetStateLocked(); @@ -713,7 +715,7 @@ public class KeyguardViewMediator extends SystemUI { mPendingLock = false; } } - KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOff(why); + KeyguardUpdateMonitor.getInstance(mContext).dispatchFinishedGoingToSleep(why); } private void doKeyguardLaterLocked() { @@ -778,12 +780,22 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "onStartedWakingUp, seq = " + mDelayedShowingSequence); notifyStartedWakingUp(); } - KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn(); + KeyguardUpdateMonitor.getInstance(mContext).dispatchStartedWakingUp(); maybeSendUserPresentBroadcast(); } public void onScreenTurningOn(IKeyguardDrawnCallback callback) { - notifyScreenOnLocked(callback); + notifyScreenOn(callback); + } + + public void onScreenTurnedOn() { + notifyScreenTurnedOn(); + mUpdateMonitor.dispatchScreenTurnedOn(); + } + + public void onScreenTurnedOff() { + notifyScreenTurnedOff(); + mUpdateMonitor.dispatchScreenTurnedOff(); } private void maybeSendUserPresentBroadcast() { @@ -1106,15 +1118,9 @@ public class KeyguardViewMediator extends SystemUI { mHandler.sendEmptyMessage(VERIFY_UNLOCK); } - - /** - * Send a message to keyguard telling it the screen just turned on. - * @see #onScreenTurnedOff(int) - * @see #handleNotifyScreenOff - */ - private void notifyScreenOffLocked() { - if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); - mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); + private void notifyFinishedGoingToSleep() { + if (DEBUG) Log.d(TAG, "notifyFinishedGoingToSleep"); + mHandler.sendEmptyMessage(NOTIFY_FINISHED_GOING_TO_SLEEP); } private void notifyStartedWakingUp() { @@ -1122,12 +1128,24 @@ public class KeyguardViewMediator extends SystemUI { mHandler.sendEmptyMessage(NOTIFY_STARTED_WAKING_UP); } - private void notifyScreenOnLocked(IKeyguardDrawnCallback callback) { - if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); + private void notifyScreenOn(IKeyguardDrawnCallback callback) { + if (DEBUG) Log.d(TAG, "notifyScreenOn"); Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNING_ON, callback); mHandler.sendMessage(msg); } + private void notifyScreenTurnedOn() { + if (DEBUG) Log.d(TAG, "notifyScreenTurnedOn"); + Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNED_ON); + mHandler.sendMessage(msg); + } + + private void notifyScreenTurnedOff() { + if (DEBUG) Log.d(TAG, "notifyScreenTurnedOff"); + Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNED_OFF); + mHandler.sendMessage(msg); + } + /** * Send message to keyguard telling it to show itself * @see #handleShow @@ -1211,12 +1229,18 @@ public class KeyguardViewMediator extends SystemUI { case VERIFY_UNLOCK: handleVerifyUnlock(); break; - case NOTIFY_SCREEN_OFF: - handleNotifyScreenOff(); + case NOTIFY_FINISHED_GOING_TO_SLEEP: + handleNotifyFinishedGoingToSleep(); break; case NOTIFY_SCREEN_TURNING_ON: handleNotifyScreenTurningOn((IKeyguardDrawnCallback) msg.obj); break; + case NOTIFY_SCREEN_TURNED_ON: + handleNotifyScreenTurnedOn(); + break; + case NOTIFY_SCREEN_TURNED_OFF: + handleNotifyScreenTurnedOff(); + break; case NOTIFY_STARTED_WAKING_UP: handleNotifyStartedWakingUp(); break; @@ -1539,20 +1563,20 @@ public class KeyguardViewMediator extends SystemUI { } /** - * Handle message sent by {@link #notifyScreenOffLocked()} - * @see #NOTIFY_SCREEN_OFF + * Handle message sent by {@link #notifyFinishedGoingToSleep()} + * @see #NOTIFY_FINISHED_GOING_TO_SLEEP */ - private void handleNotifyScreenOff() { + private void handleNotifyFinishedGoingToSleep() { synchronized (KeyguardViewMediator.this) { - if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); - mStatusBarKeyguardViewManager.onScreenTurnedOff(); + if (DEBUG) Log.d(TAG, "handleNotifyFinishedGoingToSleep"); + mStatusBarKeyguardViewManager.onFinishedGoingToSleep(); } } private void handleNotifyStartedWakingUp() { synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleNotifyWakingUp"); - mStatusBarKeyguardViewManager.onScreenTurnedOn(); + mStatusBarKeyguardViewManager.onStartedWakingUp(); } } @@ -1569,6 +1593,20 @@ public class KeyguardViewMediator extends SystemUI { } } + private void handleNotifyScreenTurnedOn() { + synchronized (this) { + if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOn"); + mStatusBarKeyguardViewManager.onScreenTurnedOn(); + } + } + + private void handleNotifyScreenTurnedOff() { + synchronized (this) { + if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOff"); + mStatusBarKeyguardViewManager.onScreenTurnedOff(); + } + } + private void notifyDrawn(final IKeyguardDrawnCallback callback) { try { callback.onDrawn(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 06b5a6b2f257..6729711af8bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1940,7 +1940,7 @@ public abstract class BaseStatusBar extends SystemUI implements logUpdate(entry, n); } boolean applyInPlace = shouldApplyInPlace(entry, n); - boolean shouldInterrupt = shouldInterrupt(entry); + boolean shouldInterrupt = shouldInterrupt(entry, notification); boolean alertAgain = alertAgain(entry, n); entry.notification = notification; @@ -2114,7 +2114,10 @@ public abstract class BaseStatusBar extends SystemUI implements } protected boolean shouldInterrupt(Entry entry) { - StatusBarNotification sbn = entry.notification; + return shouldInterrupt(entry, entry.notification); + } + + protected boolean shouldInterrupt(Entry entry, StatusBarNotification sbn) { if (mNotificationData.shouldFilterOut(sbn)) { if (DEBUG) { Log.d(TAG, "Skipping HUN check for " + sbn.getKey() + " since it's filtered out."); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AppInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AppInfo.java new file mode 100644 index 000000000000..67dd6736a9f6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AppInfo.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import android.content.ComponentName; + +/** + * Navigation bar app information. + */ +class AppInfo { + /** + * Unspecified serial number for the app's user. + */ + public static final long USER_UNSPECIFIED = -1; + + private final ComponentName mComponentName; + private final long mUserSerialNumber; + + public AppInfo(ComponentName componentName, long userSerialNumber) { + mComponentName = componentName; + mUserSerialNumber = userSerialNumber; + } + + public ComponentName getComponentName() { + return mComponentName; + } + + public long getUserSerialNumber() { + return mUserSerialNumber; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 7c08efc08ba0..6627360a641a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -634,13 +634,13 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } @Override - public void onScreenTurnedOn() { - mLockIcon.setScreenOn(true); + public void onStartedWakingUp() { + mLockIcon.setDeviceInteractive(true); } @Override - public void onScreenTurnedOff(int why) { - mLockIcon.setScreenOn(false); + public void onFinishedGoingToSleep(int why) { + mLockIcon.setDeviceInteractive(false); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index d93f7c29d08a..06d2fca442f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -47,9 +47,9 @@ public class LockIcon extends KeyguardAffordanceView { private static final int STATE_FINGERPRINT_ERROR = 4; private int mLastState = 0; - private boolean mLastScreenOn; + private boolean mLastDeviceInteractive; private boolean mTransientFpError; - private boolean mScreenOn; + private boolean mDeviceInteractive; private final TrustDrawable mTrustDrawable; private final UnlockMethodCache mUnlockMethodCache; private AccessibilityController mAccessibilityController; @@ -83,13 +83,14 @@ public class LockIcon extends KeyguardAffordanceView { update(); } - public void setScreenOn(boolean screenOn) { - mScreenOn = screenOn; + public void setDeviceInteractive(boolean deviceInteractive) { + mDeviceInteractive = deviceInteractive; update(); } public void update() { - boolean visible = isShown() && KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + boolean visible = isShown() + && KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); if (visible) { mTrustDrawable.start(); } else { @@ -101,8 +102,9 @@ public class LockIcon extends KeyguardAffordanceView { // TODO: Real icon for facelock. int state = getState(); boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR; - if (state != mLastState || mScreenOn != mLastScreenOn) { - int iconRes = getAnimationResForTransition(mLastState, state, mLastScreenOn, mScreenOn); + if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive) { + int iconRes = getAnimationResForTransition(mLastState, state, mLastDeviceInteractive, + mDeviceInteractive); if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) { anyFingerprintIcon = true; } @@ -149,7 +151,7 @@ public class LockIcon extends KeyguardAffordanceView { } } mLastState = state; - mLastScreenOn = mScreenOn; + mLastDeviceInteractive = mDeviceInteractive; } // Hide trust circle when fingerprint is running. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java index d0607562fcd7..71ee4e42f2e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java @@ -18,19 +18,26 @@ package com.android.systemui.statusbar.phone; import android.animation.LayoutTransition; import android.annotation.Nullable; +import android.app.ActivityManager; import android.app.ActivityOptions; +import android.app.AppGlobals; import android.content.ClipData; import android.content.ClipDescription; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; -import android.content.pm.LauncherApps; +import android.content.pm.ActivityInfo; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Rect; import android.os.Bundle; +import android.os.RemoteException; import android.os.UserHandle; +import android.os.UserManager; import android.util.AttributeSet; +import android.util.Log; import android.util.Slog; import android.view.DragEvent; import android.view.LayoutInflater; @@ -38,9 +45,12 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.Toast; import com.android.systemui.R; +import java.util.List; + /** * Container for application icons that appear in the navigation bar. Their appearance is similar * to the launcher hotseat. Clicking an icon launches the associated activity. A long click will @@ -51,11 +61,15 @@ class NavigationBarApps extends LinearLayout { private final static boolean DEBUG = false; private final static String TAG = "NavigationBarApps"; + /** + * Intent extra to store user serial number. + */ + static final String EXTRA_PROFILE = "profile"; + // There are separate NavigationBarApps view instances for landscape vs. portrait, but they // share the data model. private static NavigationBarAppsModel sAppsModel; - private final LauncherApps mLauncherApps; private final PackageManager mPackageManager; private final LayoutInflater mLayoutInflater; @@ -74,7 +88,6 @@ class NavigationBarApps extends LinearLayout { sAppsModel = new NavigationBarAppsModel(context); sAppsModel.initialize(); // Load the saved icons, if any. } - mLauncherApps = (LauncherApps) context.getSystemService("launcherapps"); mPackageManager = context.getPackageManager(); mLayoutInflater = LayoutInflater.from(context); @@ -121,12 +134,12 @@ class NavigationBarApps extends LinearLayout { ImageView button = createAppButton(); addView(button); - ComponentName activityName = sAppsModel.getApp(i); - CharSequence appLabel = getAppLabel(mPackageManager, activityName); - button.setContentDescription(getAppLabel(mPackageManager, activityName)); + AppInfo app = sAppsModel.getApp(i); + CharSequence appLabel = getAppLabel(mPackageManager, app.getComponentName()); + button.setContentDescription(appLabel); // Load the icon asynchronously. - new GetActivityIconTask(mPackageManager, button).execute(activityName); + new GetActivityIconTask(mPackageManager, button).execute(app.getComponentName()); } } @@ -150,8 +163,8 @@ class NavigationBarApps extends LinearLayout { public boolean onLongClick(View v) { mDragView = v; ImageView icon = (ImageView) v; - ComponentName activityName = sAppsModel.getApp(indexOfChild(v)); - startAppDrag(icon, activityName); + AppInfo app = sAppsModel.getApp(indexOfChild(v)); + startAppDrag(icon, app); return true; } } @@ -175,9 +188,13 @@ class NavigationBarApps extends LinearLayout { } /** Helper function to start dragging an app icon (either pinned or recent). */ - static void startAppDrag(ImageView icon, ComponentName activityName) { + static void startAppDrag(ImageView icon, AppInfo appInfo) { // The drag data is an Intent to launch the activity. - Intent mainIntent = Intent.makeMainActivity(activityName); + Intent mainIntent = Intent.makeMainActivity(appInfo.getComponentName()); + long userSerialNumber = appInfo.getUserSerialNumber(); + if (userSerialNumber != AppInfo.USER_UNSPECIFIED) { + mainIntent.putExtra(EXTRA_PROFILE, userSerialNumber); + } ClipData dragData = ClipData.newIntent("", mainIntent); // Use the ImageView to create the shadow. View.DragShadowBuilder shadow = new AppIconDragShadowBuilder(icon); @@ -294,7 +311,7 @@ class NavigationBarApps extends LinearLayout { addView(mDragView, targetIndex); // Update the data model. - ComponentName app = sAppsModel.removeApp(dragViewIndex); + AppInfo app = sAppsModel.removeApp(dragViewIndex); sAppsModel.addApp(targetIndex, app); } @@ -314,15 +331,15 @@ class NavigationBarApps extends LinearLayout { } // The drag view was a placeholder. Unpack the drop. - ComponentName activityName = getActivityNameFromDragEvent(event); - if (activityName == null) { + AppInfo appInfo = getAppFromDragEvent(event); + if (appInfo == null) { // This wasn't a valid drop. Clean up the placeholder and model. removePlaceholderDragViewIfNeeded(); - return true; + return false; } // The drop had valid data. Update the placeholder with a real activity and icon. - updateAppAt(dragViewIndex, activityName); + updateAppAt(dragViewIndex, appInfo); endDrag(); return true; } @@ -334,8 +351,8 @@ class NavigationBarApps extends LinearLayout { sAppsModel.savePrefs(); } - /** Returns an app launch Intent from a DragEvent, or null if the data wasn't valid. */ - private ComponentName getActivityNameFromDragEvent(DragEvent event) { + /** Returns an app info from a DragEvent, or null if the data wasn't valid. */ + private AppInfo getAppFromDragEvent(DragEvent event) { ClipData data = event.getClipData(); if (data == null) { return null; @@ -347,14 +364,16 @@ class NavigationBarApps extends LinearLayout { if (intent == null) { return null; } - return intent.getComponent(); + + long userSerialNumber = intent.getLongExtra(EXTRA_PROFILE, AppInfo.USER_UNSPECIFIED); + return new AppInfo(intent.getComponent(), userSerialNumber); } /** Updates the app at a given view index. */ - private void updateAppAt(int index, ComponentName activityName) { - sAppsModel.setApp(index, activityName); + private void updateAppAt(int index, AppInfo appInfo) { + sAppsModel.setApp(index, appInfo); ImageView button = (ImageView) getChildAt(index); - new GetActivityIconTask(mPackageManager, button).execute(activityName); + new GetActivityIconTask(mPackageManager, button).execute(appInfo.getComponentName()); } /** Removes the empty placeholder view and cleans up the data model. */ @@ -411,11 +430,26 @@ class NavigationBarApps extends LinearLayout { private class AppClickListener implements View.OnClickListener { @Override public void onClick(View v) { - ComponentName activityName = sAppsModel.getApp(indexOfChild(v)); + AppInfo appInfo = sAppsModel.getApp(indexOfChild(v)); + ComponentName component = appInfo.getComponentName(); + + UserManager userManager = + (UserManager) getContext().getSystemService(Context.USER_SERVICE); - // TODO: Support apps from multiple user profiles. The profile will need to be stored in - // the data model for each app shortcut. - UserHandle user = UserHandle.OWNER; + long appUserSerialNumber = appInfo.getUserSerialNumber(); + + UserHandle appUser = null; + if (appUserSerialNumber != AppInfo.USER_UNSPECIFIED) { + appUser = userManager.getUserForSerialNumber(appUserSerialNumber); + } + + int appUserId; + if (appUser != null) { + appUserId = appUser.getIdentifier(); + } else { + appUserId = ActivityManager.getCurrentUser(); + appUser = new UserHandle(appUserId); + } // Play a scale-up animation while launching the activity. // TODO: Consider playing a different animation, or no animation, if the activity is @@ -427,8 +461,53 @@ class NavigationBarApps extends LinearLayout { ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getWidth(), v.getHeight()); Bundle optsBundle = opts.toBundle(); - // Launch the activity. - mLauncherApps.startMainActivity(activityName, user, sourceBounds, optsBundle); + // Launch the activity. This code is based on LauncherAppsService.startActivityAsUser code. + Intent launchIntent = new Intent(Intent.ACTION_MAIN); + launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); + launchIntent.setSourceBounds(sourceBounds); + launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + launchIntent.setPackage(component.getPackageName()); + + IPackageManager pm = AppGlobals.getPackageManager(); + try { + ActivityInfo info = pm.getActivityInfo(component, 0, appUserId); + if (info == null) { + Toast.makeText(getContext(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); + Log.e(TAG, "Can't start activity " + component + " because it's not installed."); + return; + } + + if (!info.exported) { + Toast.makeText(getContext(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); + Log.e(TAG, "Can't start activity " + component + " because it doesn't have 'exported' attribute."); + return; + } + } catch (RemoteException e) { + Toast.makeText(getContext(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); + Log.e(TAG, "Failed to get activity info for " + component, e); + return; + } + + // Check that the component actually has Intent.CATEGORY_LAUCNCHER + // as calling startActivityAsUser ignores the category and just + // resolves based on the component if present. + List<ResolveInfo> apps = getContext().getPackageManager().queryIntentActivitiesAsUser(launchIntent, + 0 /* flags */, appUserId); + final int size = apps.size(); + for (int i = 0; i < size; ++i) { + ActivityInfo activityInfo = apps.get(i).activityInfo; + if (activityInfo.packageName.equals(component.getPackageName()) && + activityInfo.name.equals(component.getClassName())) { + // Found an activity with category launcher that matches + // this component so ok to launch. + launchIntent.setComponent(component); + mContext.startActivityAsUser(launchIntent, optsBundle, appUser); + return; + } + } + + Toast.makeText(getContext(), R.string.activity_not_found, Toast.LENGTH_SHORT).show(); + Log.e(TAG, "Attempt to launch activity without category Intent.CATEGORY_LAUNCHER " + component); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java index d74a5223283d..9f80d33aed88 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarAppsModel.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; @@ -55,11 +56,14 @@ class NavigationBarAppsModel { // Preference name prefix for each app's info. The actual pref has an integer appended to it. private final static String APP_PREF_PREFIX = "app_"; + // User serial number prefix for each app's info. The actual pref has an integer appended to it. + private final static String APP_USER_PREFIX = "app_user_"; + private final LauncherApps mLauncherApps; private final SharedPreferences mPrefs; - // Apps are represented as an ordered list of component names. - private final List<ComponentName> mApps = new ArrayList<ComponentName>(); + // Apps are represented as an ordered list of app infos. + private final List<AppInfo> mApps = new ArrayList<AppInfo>(); public NavigationBarAppsModel(Context context) { mLauncherApps = (LauncherApps) context.getSystemService("launcherapps"); @@ -97,22 +101,22 @@ class NavigationBarAppsModel { } /** Returns the app at the given index. */ - public ComponentName getApp(int index) { + public AppInfo getApp(int index) { return mApps.get(index); } /** Adds the app before the given index. */ - public void addApp(int index, ComponentName name) { - mApps.add(index, name); + public void addApp(int index, AppInfo appInfo) { + mApps.add(index, appInfo); } /** Sets the app at the given index. */ - public void setApp(int index, ComponentName name) { - mApps.set(index, name); + public void setApp(int index, AppInfo appInfo) { + mApps.set(index, appInfo); } /** Remove the app at the given index. */ - public ComponentName removeApp(int index) { + public AppInfo removeApp(int index) { return mApps.remove(index); } @@ -125,8 +129,10 @@ class NavigationBarAppsModel { int appCount = mApps.size(); edit.putInt(APP_COUNT_PREF, appCount); for (int i = 0; i < appCount; i++) { - String componentNameString = mApps.get(i).flattenToString(); + final AppInfo appInfo = mApps.get(i); + String componentNameString = appInfo.getComponentName().flattenToString(); edit.putString(prefNameForApp(i), componentNameString); + edit.putLong(prefUserForApp(i), appInfo.getUserSerialNumber()); } // Start an asynchronous disk write. edit.apply(); @@ -143,7 +149,8 @@ class NavigationBarAppsModel { continue; } ComponentName componentName = ComponentName.unflattenFromString(prefValue); - mApps.add(componentName); + long userSerialNumber = mPrefs.getLong(prefUserForApp(i), AppInfo.USER_UNSPECIFIED); + mApps.add(new AppInfo(componentName, userSerialNumber)); } } @@ -151,11 +158,12 @@ class NavigationBarAppsModel { private void addDefaultApps() { // Get a list of all app activities. List<LauncherActivityInfo> apps = - mLauncherApps.getActivityList(null /* packageName */, UserHandle.OWNER); + mLauncherApps.getActivityList( + null /* packageName */, new UserHandle(ActivityManager.getCurrentUser())); int appCount = apps.size(); for (int i = 0; i < NUM_INITIAL_APPS && i < appCount; i++) { LauncherActivityInfo activityInfo = apps.get(i); - mApps.add(activityInfo.getComponentName()); + mApps.add(new AppInfo(activityInfo.getComponentName(), AppInfo.USER_UNSPECIFIED)); } } @@ -163,4 +171,10 @@ class NavigationBarAppsModel { private static String prefNameForApp(int index) { return APP_PREF_PREFIX + Integer.toString(index); } + + /** Returns the pref name for the app's user at a given index. */ + private static String prefUserForApp(int index) { + return APP_USER_PREFIX + Integer.toString(index); + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java index c7fae9207647..eaa1c20c9b0c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java @@ -232,7 +232,7 @@ class NavigationBarRecents extends LinearLayout { } if (DEBUG) Slog.d(TAG, "Start drag with " + intent); - NavigationBarApps.startAppDrag(icon, intent.getComponent()); + NavigationBarApps.startAppDrag(icon, new AppInfo (intent.getComponent(), AppInfo.USER_UNSPECIFIED)); return true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index c3f093a577ab..af25562da9f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -91,6 +91,7 @@ public class NavigationBarView extends LinearLayout { private OnVerticalChangedListener mOnVerticalChangedListener; private boolean mIsLayoutRtl; + private boolean mLayoutTransitionsEnabled; private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; @@ -337,13 +338,6 @@ public class NavigationBarView extends LinearLayout { if (!lt.getTransitionListeners().contains(mTransitionListener)) { lt.addTransitionListener(mTransitionListener); } - if (!mScreenOn && mCurrentView != null) { - lt.disableTransitionType( - LayoutTransition.CHANGE_APPEARING | - LayoutTransition.CHANGE_DISAPPEARING | - LayoutTransition.APPEARING | - LayoutTransition.DISAPPEARING); - } } } if (inLockTask() && disableRecent && !disableHome) { @@ -377,6 +371,44 @@ public class NavigationBarView extends LinearLayout { } } + public void setWakeAndUnlocking(boolean wakeAndUnlocking) { + setUseFadingAnimations(wakeAndUnlocking); + setLayoutTransitionsEnabled(!wakeAndUnlocking); + } + + private void setLayoutTransitionsEnabled(boolean enabled) { + mLayoutTransitionsEnabled = enabled; + ViewGroup navButtons = (ViewGroup) mCurrentView.findViewById(R.id.nav_buttons); + LayoutTransition lt = navButtons.getLayoutTransition(); + if (enabled) { + lt.enableTransitionType(LayoutTransition.APPEARING); + lt.enableTransitionType(LayoutTransition.DISAPPEARING); + lt.enableTransitionType(LayoutTransition.CHANGE_APPEARING); + lt.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + } else { + lt.disableTransitionType(LayoutTransition.APPEARING); + lt.disableTransitionType(LayoutTransition.DISAPPEARING); + lt.disableTransitionType(LayoutTransition.CHANGE_APPEARING); + lt.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + } + } + + private void setUseFadingAnimations(boolean useFadingAnimations) { + WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); + if (lp != null) { + boolean old = lp.windowAnimations != 0; + if (!old && useFadingAnimations) { + lp.windowAnimations = R.style.Animation_NavigationBarFadeIn; + } else if (old && !useFadingAnimations) { + lp.windowAnimations = 0; + } else { + return; + } + WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE); + wm.updateViewLayout(this, lp); + } + } + public void setSlippery(boolean newSlippery) { WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); if (lp != null) { @@ -435,6 +467,7 @@ public class NavigationBarView extends LinearLayout { } mCurrentView = mRotatedViews[rot]; mCurrentView.setVisibility(View.VISIBLE); + setLayoutTransitionsEnabled(mLayoutTransitionsEnabled); getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index dd97dac6029e..81ab4db46197 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -26,11 +26,13 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Rect; import android.util.AttributeSet; import android.util.MathUtils; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; +import android.view.ViewRootImpl; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; @@ -42,6 +44,7 @@ import android.widget.TextView; import com.android.internal.logging.MetricsLogger; import com.android.keyguard.KeyguardStatusView; +import com.android.systemui.DejankUtils; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.R; @@ -79,6 +82,8 @@ public class NotificationPanelView extends PanelView implements private static final String COUNTER_PANEL_OPEN_QS = "panel_open_qs"; private static final String COUNTER_PANEL_OPEN_PEEK = "panel_open_peek"; + private static final Rect mDummyDirtyRect = new Rect(0, 0, 1, 1); + public static final long DOZE_ANIMATION_DURATION = 700; private KeyguardAffordanceHelper mAfforanceHelper; @@ -1777,7 +1782,22 @@ public class NotificationPanelView extends PanelView implements mIsExpanding = false; mScrollYOverride = -1; if (isFullyCollapsed()) { - setListening(false); + DejankUtils.postAfterTraversal(new Runnable() { + @Override + public void run() { + setListening(false); + } + }); + + // Workaround b/22639032: Make sure we invalidate something because else RenderThread + // thinks we are actually drawing a frame put in reality we don't, so RT doesn't go + // ahead with rendering and we jank. + postOnAnimation(new Runnable() { + @Override + public void run() { + getParent().invalidateChild(NotificationPanelView.this, mDummyDirtyRect); + } + }); } else { setListening(true); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 7391ea218fa0..5d64abb9809b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3183,9 +3183,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, @Override public boolean shouldDisableNavbarGestures() { - return !isDeviceProvisioned() - || mExpandedVisible - || (mDisabled1 & StatusBarManager.DISABLE_SEARCH) != 0; + return !isDeviceProvisioned() || (mDisabled1 & StatusBarManager.DISABLE_SEARCH) != 0; } public void postStartActivityDismissingKeyguard(final Intent intent, int delay) { @@ -3977,7 +3975,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mScreenOnComingFromTouch = true; mScreenOnTouchLocation = new PointF(event.getX(), event.getY()); mNotificationPanel.setTouchDisabled(false); - mStatusBarKeyguardViewManager.notifyScreenWakeUpRequested(); + mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 6816399a3a64..1a35500abac2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -22,11 +22,12 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Color; +import android.util.Log; import android.view.View; import android.view.ViewTreeObserver; -import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; import com.android.systemui.R; import com.android.systemui.statusbar.BackDropView; @@ -62,6 +63,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private boolean mDarkenWhileDragging; private boolean mBouncerShowing; + private boolean mWakeAndUnlocking; private boolean mAnimateChange; private boolean mUpdatePending; private boolean mExpanding; @@ -71,7 +73,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private Runnable mOnAnimationFinished; private boolean mAnimationStarted; private final Interpolator mInterpolator = new DecelerateInterpolator(); - private final Interpolator mLinearOutSlowInInterpolator; + private final Interpolator mKeyguardFadeOutInterpolator = new PathInterpolator(0f, 0, 0.7f, 1f); private BackDropView mBackDropView; private boolean mScrimSrcEnabled; private boolean mDozing; @@ -92,8 +94,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mHeadsUpScrim = headsUpScrim; final Context context = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(context); - mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, - android.R.interpolator.linear_out_slow_in); mScrimSrcEnabled = scrimSrcEnabled; updateHeadsUpScrim(false); } @@ -128,7 +128,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, scheduleUpdate(); } + public void setWakeAndUnlocking() { + mWakeAndUnlocking = true; + scheduleUpdate(); + } + public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) { + mWakeAndUnlocking = false; mAnimateKeyguardFadingOut = true; mDurationOverride = duration; mAnimationDelay = delay; @@ -151,8 +157,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } public void setDozing(boolean dozing) { - mDozing = dozing; - scheduleUpdate(); + if (mDozing != dozing) { + mDozing = dozing; + scheduleUpdate(); + } } public void setDozeInFrontAlpha(float alpha) { @@ -186,6 +194,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, if (mAnimateKeyguardFadingOut || mForceHideScrims) { setScrimInFrontColor(0f); setScrimBehindColor(0f); + } else if (mWakeAndUnlocking) { + + // During wake and unlock, we first hide everything behind a black scrim, which then + // gets faded out from animateKeyguardFadingOut. + setScrimInFrontColor(1f); + setScrimBehindColor(0f); } else if (!mKeyguardShowing && !mBouncerShowing) { updateScrimNormal(); setScrimInFrontColor(0); @@ -319,7 +333,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } private Interpolator getInterpolator() { - return mAnimateKeyguardFadingOut ? mLinearOutSlowInInterpolator : mInterpolator; + return mAnimateKeyguardFadingOut ? mKeyguardFadeOutInterpolator : mInterpolator; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 5d58cd0aac2e..7ee47dff37e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -789,7 +789,9 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mQsDetailHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - detail.setToggleState(!mQsDetailHeaderSwitch.isChecked()); + boolean checked = !mQsDetailHeaderSwitch.isChecked(); + mQsDetailHeaderSwitch.setChecked(checked); + detail.setToggleState(checked); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 6b3a59df71e0..44aa780706d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -20,6 +20,7 @@ import android.content.ComponentCallbacks2; import android.content.Context; import android.os.Bundle; import android.os.SystemClock; +import android.os.Trace; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -59,7 +60,8 @@ public class StatusBarKeyguardViewManager { private ViewGroup mContainer; private StatusBarWindowManager mStatusBarWindowManager; - private boolean mScreenOn = false; + private boolean mDeviceInteractive = false; + private boolean mScreenTurnedOn; private KeyguardBouncer mBouncer; private boolean mShowing; private boolean mOccluded; @@ -69,8 +71,11 @@ public class StatusBarKeyguardViewManager { private boolean mLastOccluded; private boolean mLastBouncerShowing; private boolean mLastBouncerDismissible; + private boolean mLastDeferScrimFadeOut; private OnDismissAction mAfterKeyguardGoneAction; - private boolean mScreenWillWakeUp; + private boolean mDeviceWillWakeUp; + private boolean mWakeAndUnlocking; + private boolean mDeferScrimFadeOut; public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils) { @@ -155,20 +160,34 @@ public class StatusBarKeyguardViewManager { } } - public void onScreenTurnedOff() { - mScreenOn = false; + public void onFinishedGoingToSleep() { + mDeviceInteractive = false; mPhoneStatusBar.onScreenTurnedOff(); mBouncer.onScreenTurnedOff(); } - public void onScreenTurnedOn() { - mScreenOn = true; - mScreenWillWakeUp = false; + public void onStartedWakingUp() { + mDeviceInteractive = true; + mDeviceWillWakeUp = false; mPhoneStatusBar.onScreenTurnedOn(); } - public void notifyScreenWakeUpRequested() { - mScreenWillWakeUp = !mScreenOn; + public void onScreenTurnedOn() { + mScreenTurnedOn = true; + mWakeAndUnlocking = false; + if (mDeferScrimFadeOut) { + mDeferScrimFadeOut = false; + animateScrimControllerKeyguardFadingOut(0, 200); + updateStates(); + } + } + + public void onScreenTurnedOff() { + mScreenTurnedOn = false; + } + + public void notifyDeviceWakeUpRequested() { + mDeviceWillWakeUp = !mDeviceInteractive; } public void verifyUnlock() { @@ -252,21 +271,11 @@ public class StatusBarKeyguardViewManager { mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration); boolean staying = mPhoneStatusBar.hideKeyguard(); if (!staying) { - if (fadeoutDuration == 0) { - mPhoneStatusBar.finishKeyguardFadingAway(); - WindowManagerGlobal.getInstance().trimMemory( - ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + mStatusBarWindowManager.setKeyguardFadingAway(true); + if (mWakeAndUnlocking && !mScreenTurnedOn) { + mDeferScrimFadeOut = true; } else { - mStatusBarWindowManager.setKeyguardFadingAway(true); - mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() { - @Override - public void run() { - mStatusBarWindowManager.setKeyguardFadingAway(false); - mPhoneStatusBar.finishKeyguardFadingAway(); - WindowManagerGlobal.getInstance().trimMemory( - ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); - } - }); + animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration); } } else { mScrimController.animateGoingToFullShade(delay, fadeoutDuration); @@ -281,6 +290,23 @@ public class StatusBarKeyguardViewManager { } + private void animateScrimControllerKeyguardFadingOut(long delay, long duration) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0); + mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() { + @Override + public void run() { + mStatusBarWindowManager.setKeyguardFadingAway(false); + mPhoneStatusBar.finishKeyguardFadingAway(); + if (mPhoneStatusBar.getNavigationBarView() != null) { + mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(false); + } + WindowManagerGlobal.getInstance().trimMemory( + ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); + Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0); + } + }); + } + private void executeAfterKeyguardGoneAction() { if (mAfterKeyguardGoneAction != null) { mAfterKeyguardGoneAction.onDismiss(); @@ -292,7 +318,7 @@ public class StatusBarKeyguardViewManager { * Dismisses the keyguard by going to the next screen or making it gone. */ public void dismiss() { - if (mScreenOn || mScreenWillWakeUp) { + if (mDeviceInteractive || mDeviceWillWakeUp) { showBouncer(); } } @@ -352,6 +378,7 @@ public class StatusBarKeyguardViewManager { boolean occluded = mOccluded; boolean bouncerShowing = mBouncer.isShowing(); boolean bouncerDismissible = !mBouncer.isFullscreenBouncer(); + boolean deferScrimFadeOut = mDeferScrimFadeOut; if ((bouncerDismissible || !showing) != (mLastBouncerDismissible || !mLastShowing) || mFirstUpdate) { @@ -361,10 +388,15 @@ public class StatusBarKeyguardViewManager { mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); } } - if ((!(showing && !occluded) || bouncerShowing) - != (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing) || mFirstUpdate) { + + // Hide navigation bar on Keyguard but not on bouncer and also if we are deferring a scrim + // fade out, i.e. we are waiting for the screen to have turned on. + boolean navBarVisible = !deferScrimFadeOut && (!(showing && !occluded) || bouncerShowing); + boolean lastNavBarVisible = !mLastDeferScrimFadeOut && (!(mLastShowing && !mLastOccluded) + || mLastBouncerShowing); + if (navBarVisible != lastNavBarVisible || mFirstUpdate) { if (mPhoneStatusBar.getNavigationBarView() != null) { - if (!(showing && !occluded) || bouncerShowing) { + if (navBarVisible) { mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, getNavBarShowDelay()); } else { @@ -391,6 +423,7 @@ public class StatusBarKeyguardViewManager { mFirstUpdate = false; mLastShowing = showing; mLastOccluded = occluded; + mLastDeferScrimFadeOut = deferScrimFadeOut; mLastBouncerShowing = bouncerShowing; mLastBouncerDismissible = bouncerDismissible; @@ -450,4 +483,12 @@ public class StatusBarKeyguardViewManager { public void notifyKeyguardAuthenticated() { mBouncer.notifyKeyguardAuthenticated(); } + + public void setWakeAndUnlocking() { + mWakeAndUnlocking = true; + mScrimController.setWakeAndUnlocking(); + if (mPhoneStatusBar.getNavigationBarView() != null) { + mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index c8c45e300480..bd537f7c816d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -127,7 +127,7 @@ public class UnlockMethodCache { } @Override - public void onScreenTurnedOn() { + public void onStartedWakingUp() { update(false /* updateAlways */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 82224d47fed7..13e9b1631b14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -25,6 +25,7 @@ import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; @@ -389,7 +390,7 @@ public class MobileSignalController extends SignalController< } // Fill in the network name if we think we have it. if (mCurrentState.networkName == mNetworkNameDefault && mServiceState != null - && mServiceState.getOperatorAlphaShort() != null) { + && !TextUtils.isEmpty(mServiceState.getOperatorAlphaShort())) { mCurrentState.networkName = mServiceState.getOperatorAlphaShort(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java index 84aaac7f4c66..f46e76c70175 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarAppsModelTest.java @@ -60,8 +60,11 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { // Assume several apps are stored. when(mMockPrefs.getInt("app_count", -1)).thenReturn(3); when(mMockPrefs.getString("app_0", null)).thenReturn("package0/class0"); + when(mMockPrefs.getLong("app_user_0", -1)).thenReturn(-1L); when(mMockPrefs.getString("app_1", null)).thenReturn("package1/class1"); + when(mMockPrefs.getLong("app_user_1", -1)).thenReturn(45L); when(mMockPrefs.getString("app_2", null)).thenReturn("package2/class2"); + when(mMockPrefs.getLong("app_user_2", -1)).thenReturn(239L); mModel.initialize(); } @@ -70,9 +73,12 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { public void testInitializeFromPrefs() { initializeModelFromPrefs(); assertEquals(3, mModel.getAppCount()); - assertEquals("package0/class0", mModel.getApp(0).flattenToString()); - assertEquals("package1/class1", mModel.getApp(1).flattenToString()); - assertEquals("package2/class2", mModel.getApp(2).flattenToString()); + assertEquals("package0/class0", mModel.getApp(0).getComponentName().flattenToString()); + assertEquals(-1L, mModel.getApp(0).getUserSerialNumber()); + assertEquals("package1/class1", mModel.getApp(1).getComponentName().flattenToString()); + assertEquals(45L, mModel.getApp(1).getUserSerialNumber()); + assertEquals("package2/class2", mModel.getApp(2).getComponentName().flattenToString()); + assertEquals(239L, mModel.getApp(2).getUserSerialNumber()); } /** Tests initializing the model when the SharedPreferences aren't available. */ @@ -94,8 +100,10 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { // Initializing the model should load the installed activities. mModel.initialize(); assertEquals(2, mModel.getAppCount()); - assertEquals("package1/class1", mModel.getApp(0).flattenToString()); - assertEquals("package2/class2", mModel.getApp(1).flattenToString()); + assertEquals("package1/class1", mModel.getApp(0).getComponentName().flattenToString()); + assertEquals(-1L, mModel.getApp(0).getUserSerialNumber()); + assertEquals("package2/class2", mModel.getApp(1).getComponentName().flattenToString()); + assertEquals(-1L, mModel.getApp(1).getUserSerialNumber()); } /** Tests initializing the model if one of the prefs is missing. */ @@ -106,6 +114,7 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { // Assume two apps are nominally stored. when(mMockPrefs.getInt("app_count", -1)).thenReturn(2); when(mMockPrefs.getString("app_0", null)).thenReturn("package0/class0"); + when(mMockPrefs.getLong("app_user_0", -1)).thenReturn(239L); // But assume one pref is missing. when(mMockPrefs.getString("app_1", null)).thenReturn(null); @@ -113,7 +122,8 @@ public class NavigationBarAppsModelTest extends AndroidTestCase { // Initializing the model should load from prefs and skip the missing one. mModel.initialize(); assertEquals(1, mModel.getAppCount()); - assertEquals("package0/class0", mModel.getApp(0).flattenToString()); + assertEquals("package0/class0", mModel.getApp(0).getComponentName().flattenToString()); + assertEquals(239L, mModel.getApp(0).getUserSerialNumber()); } /** Tests saving the model to SharedPreferences. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 5055bfefe889..00b8de237347 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy; import android.os.HandlerThread; import android.telephony.SubscriptionInfo; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; @@ -32,6 +33,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; +@SmallTest public class CallbackHandlerTest extends AndroidTestCase { private CallbackHandler mHandler; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index 360562c8a967..0ec8802f9c60 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -2,9 +2,11 @@ package com.android.systemui.statusbar.policy; import android.os.Looper; import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.SmallTest; import org.mockito.Mockito; +@SmallTest public class NetworkControllerDataTest extends NetworkControllerBaseTest { public void test3gDataIcon() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java index 5d63d8dd506c..b2fedfaeb8f6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java @@ -1,12 +1,14 @@ package com.android.systemui.statusbar.policy; import android.net.NetworkCapabilities; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.statusbar.policy.NetworkController.IconState; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +@SmallTest public class NetworkControllerEthernetTest extends NetworkControllerBaseTest { public void testEthernetIcons() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index d9b9063396cb..660fd9c40721 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -25,6 +25,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; @@ -36,6 +37,7 @@ import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; +@SmallTest public class NetworkControllerSignalTest extends NetworkControllerBaseTest { public void testNoIconWithoutMobile() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index cecf2fde3cfb..d7c4e1e06514 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -5,12 +5,14 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.statusbar.policy.NetworkController.IconState; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +@SmallTest public class NetworkControllerWifiTest extends NetworkControllerBaseTest { // These match the constants in WifiManager and need to be kept up to date. private static final int MIN_RSSI = -100; diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 0206c132bf85..a0443188f80a 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -9536,16 +9536,8 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF public void run() { // clean up the session's bookkeeping synchronized (mSession) { - try { - if (mSession.mRestoreTransport != null) { - mSession.mRestoreTransport.finishRestore(); - } - } catch (Exception e) { - Slog.e(TAG, "Error in finishRestore", e); - } finally { - mSession.mRestoreTransport = null; - mSession.mEnded = true; - } + mSession.mRestoreTransport = null; + mSession.mEnded = true; } // clean up the BackupManagerImpl side of the bookkeeping diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 1fe174118bbe..8b92de14c205 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1784,7 +1784,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Start gathering diagnostic information. netDiags.add(new NetworkDiagnostics( nai.network, - new LinkProperties(nai.linkProperties), + new LinkProperties(nai.linkProperties), // Must be a copy. DIAG_TIME_MS)); } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index cae060a8493e..468ead0e9c92 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -542,22 +542,25 @@ public class LocationManagerService extends ILocationManager.Stub { Slog.e(TAG, "Unable to bind FLP Geofence proxy."); } - // bind to the hardware activity recognition if supported - if (ActivityRecognitionHardware.isSupported()) { - ActivityRecognitionProxy proxy = ActivityRecognitionProxy.createAndBind( - mContext, - mLocationHandler, - ActivityRecognitionHardware.getInstance(mContext), - com.android.internal.R.bool.config_enableActivityRecognitionHardwareOverlay, - com.android.internal.R.string.config_activityRecognitionHardwarePackageName, - com.android.internal.R.array.config_locationProviderPackageNames); - - if (proxy == null) { - Slog.e(TAG, "Unable to bind ActivityRecognitionProxy."); - } + // bind to hardware activity recognition + boolean activityRecognitionHardwareIsSupported = ActivityRecognitionHardware.isSupported(); + ActivityRecognitionHardware activityRecognitionHardware = null; + if (activityRecognitionHardwareIsSupported) { + activityRecognitionHardware = ActivityRecognitionHardware.getInstance(mContext); } else { Slog.e(TAG, "Hardware Activity-Recognition not supported."); } + ActivityRecognitionProxy proxy = ActivityRecognitionProxy.createAndBind( + mContext, + mLocationHandler, + activityRecognitionHardwareIsSupported, + activityRecognitionHardware, + com.android.internal.R.bool.config_enableActivityRecognitionHardwareOverlay, + com.android.internal.R.string.config_activityRecognitionHardwarePackageName, + com.android.internal.R.array.config_locationProviderPackageNames); + if (proxy == null) { + Slog.e(TAG, "Unable to bind ActivityRecognitionProxy."); + } String[] testProviderStrings = resources.getStringArray( com.android.internal.R.array.config_testLocationProviders); diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 55dd38a3e58f..7d26a8f3dab7 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -69,7 +69,6 @@ import android.os.storage.IMountServiceListener; import android.os.storage.IMountShutdownObserver; import android.os.storage.IObbActionListener; import android.os.storage.MountServiceInternal; -import android.os.storage.MountServiceInternal.ExternalStorageMountPolicy; import android.os.storage.OnObbStateChangeListener; import android.os.storage.StorageManager; import android.os.storage.StorageResultCode; @@ -146,8 +145,6 @@ import javax.crypto.spec.PBEKeySpec; class MountService extends IMountService.Stub implements INativeDaemonConnectorCallbacks, Watchdog.Monitor { - // TODO: finish enforcing UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA - // Static direct instance pointer for the tightly-coupled idle service to use static MountService sSelf = null; @@ -631,6 +628,10 @@ class MountService extends IMountService.Stub } case H_VOLUME_MOUNT: { final VolumeInfo vol = (VolumeInfo) msg.obj; + if (isMountDisallowed(vol)) { + Slog.i(TAG, "Ignoring mount " + vol.getId() + " due to policy"); + break; + } try { mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId); @@ -807,7 +808,7 @@ class MountService extends IMountService.Stub synchronized (mVolumes) { for (int i = 0; i < mVolumes.size(); i++) { final VolumeInfo vol = mVolumes.valueAt(i); - if (vol.isVisibleToUser(userId) && vol.isMountedReadable()) { + if (vol.isVisibleForRead(userId) && vol.isMountedReadable()) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false); mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget(); @@ -1250,7 +1251,7 @@ class MountService extends IMountService.Stub // started after this point will trigger additional // user-specific broadcasts. for (int userId : mStartedUsers) { - if (vol.isVisibleToUser(userId)) { + if (vol.isVisibleForRead(userId)) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false); mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget(); @@ -1305,10 +1306,16 @@ class MountService extends IMountService.Stub mContext.enforceCallingOrSelfPermission(perm, perm); } - private void enforceUserRestriction(String restriction) { - UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - if (um.hasUserRestriction(restriction, Binder.getCallingUserHandle())) { - throw new SecurityException("User has restriction " + restriction); + /** + * Decide if volume is mountable per device policies. + */ + private boolean isMountDisallowed(VolumeInfo vol) { + if (vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_PRIVATE) { + final UserManager userManager = mContext.getSystemService(UserManager.class); + return userManager.hasUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, + Binder.getCallingUserHandle()); + } else { + return false; } } @@ -1586,8 +1593,8 @@ class MountService extends IMountService.Stub waitForReady(); final VolumeInfo vol = findVolumeByIdOrThrow(volId); - if (vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_PRIVATE) { - enforceUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA); + if (isMountDisallowed(vol)) { + throw new SecurityException("Mounting " + volId + " restricted by policy"); } try { mConnector.execute("volume", "mount", vol.id, vol.mountFlags, vol.mountUserId); @@ -2659,13 +2666,14 @@ class MountService extends IMountService.Stub } @Override - public StorageVolume[] getVolumeList(int uid, String packageName) { + public StorageVolume[] getVolumeList(int uid, String packageName, int flags) { + final boolean forWrite = (flags & StorageManager.FLAG_FOR_WRITE) != 0; + final ArrayList<StorageVolume> res = new ArrayList<>(); boolean foundPrimary = false; final int userId = UserHandle.getUserId(uid); final boolean reportUnmounted; - final long identity = Binder.clearCallingIdentity(); try { reportUnmounted = !mMountServiceInternal.hasExternalStorage( @@ -2677,7 +2685,7 @@ class MountService extends IMountService.Stub synchronized (mLock) { for (int i = 0; i < mVolumes.size(); i++) { final VolumeInfo vol = mVolumes.valueAt(i); - if (vol.isVisibleToUser(userId)) { + if (forWrite ? vol.isVisibleForWrite(userId) : vol.isVisibleForRead(userId)) { final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, reportUnmounted); if (vol.isPrimary()) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 94580687fcef..0904bfd0e365 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1232,6 +1232,8 @@ public final class ActivityManagerService extends ActivityManagerNative final ArrayList<UidRecord.ChangeItem> mPendingUidChanges = new ArrayList<>(); final ArrayList<UidRecord.ChangeItem> mAvailUidChanges = new ArrayList<>(); + ArraySet<String> mAppsNotReportingCrashes; + /** * Runtime CPU use collection thread. This object's lock is used to * perform synchronization with the thread (notifying it to run). @@ -1420,7 +1422,9 @@ public final class ActivityManagerService extends ActivityManagerNative } return; } - if (mShowDialogs && !mSleeping && !mShuttingDown) { + final boolean crashSilenced = mAppsNotReportingCrashes != null && + mAppsNotReportingCrashes.contains(proc.info.packageName); + if (mShowDialogs && !mSleeping && !mShuttingDown && !crashSilenced) { Dialog d = new AppErrorDialog(mContext, ActivityManagerService.this, res, proc); d.show(); @@ -4719,15 +4723,6 @@ public final class ActivityManagerService extends ActivityManagerNative File tracesFile = new File(tracesPath); try { - File tracesDir = tracesFile.getParentFile(); - if (!tracesDir.exists()) { - tracesDir.mkdirs(); - if (!SELinux.restorecon(tracesDir)) { - return null; - } - } - FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x - if (clearTraces && tracesFile.exists()) tracesFile.delete(); tracesFile.createNewFile(); FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw- @@ -4830,14 +4825,6 @@ public final class ActivityManagerService extends ActivityManagerNative final File tracesDir = tracesFile.getParentFile(); final File tracesTmp = new File(tracesDir, "__tmp__"); try { - if (!tracesDir.exists()) { - tracesDir.mkdirs(); - if (!SELinux.restorecon(tracesDir.getPath())) { - return; - } - } - FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x - if (tracesFile.exists()) { tracesTmp.delete(); tracesFile.renameTo(tracesTmp); @@ -5844,7 +5831,10 @@ public final class ActivityManagerService extends ActivityManagerNative // We shouldn't already have a process under this name, but just in case we // need to clean up whatever may be there now. ProcessRecord old = removeProcessNameLocked(proc.processName, proc.uid); - if (old != null) { + if (old == proc && proc.persistent) { + // We are re-adding a persistent process. Whatevs! Just leave it there. + Slog.w(TAG, "Re-adding persistent process " + proc); + } else if (old != null) { Slog.wtf(TAG, "Already have existing proc " + old + " when adding " + proc); } UidRecord uidRec = mActiveUids.get(proc.uid); @@ -20590,6 +20580,13 @@ public final class ActivityManagerService extends ActivityManagerNative } } + void stopReportingCrashesLocked(ProcessRecord proc) { + if (mAppsNotReportingCrashes == null) { + mAppsNotReportingCrashes = new ArraySet<>(); + } + mAppsNotReportingCrashes.add(proc.info.packageName); + } + private final class LocalService extends ActivityManagerInternal { @Override public void onWakefulnessChanged(int wakefulness) { diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index d16eab6850a9..0957eb5af120 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -530,13 +530,13 @@ final class ActivityRecord { AttributeCache.Entry ent = AttributeCache.instance().get(packageName, realTheme, com.android.internal.R.styleable.Window, userId); - final boolean translucent = ent.array.getBoolean( + final boolean translucent = ent != null && (ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsTranslucent, false) || (!ent.array.hasValue( com.android.internal.R.styleable.Window_windowIsTranslucent) && ent.array.getBoolean( com.android.internal.R.styleable.Window_windowSwipeToDismiss, - false)); + false))); fullscreen = ent != null && !ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsFloating, false) && !translucent; diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java index c8fb351bc416..c87eae0d61e2 100644 --- a/services/core/java/com/android/server/am/AppErrorDialog.java +++ b/services/core/java/com/android/server/am/AppErrorDialog.java @@ -19,14 +19,22 @@ package com.android.server.am; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; +import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.FrameLayout; +import android.widget.TextView; final class AppErrorDialog extends BaseErrorDialog { private final ActivityManagerService mService; private final AppErrorResult mResult; private final ProcessRecord mProc; + private CharSequence mName; // Event 'what' codes static final int FORCE_QUIT = 0; @@ -38,23 +46,22 @@ final class AppErrorDialog extends BaseErrorDialog { public AppErrorDialog(Context context, ActivityManagerService service, AppErrorResult result, ProcessRecord app) { super(context); - + Resources res = context.getResources(); - + mService = service; mProc = app; mResult = result; - CharSequence name; if ((app.pkgList.size() == 1) && - (name=context.getPackageManager().getApplicationLabel(app.info)) != null) { + (mName = context.getPackageManager().getApplicationLabel(app.info)) != null) { setMessage(res.getString( com.android.internal.R.string.aerr_application, - name.toString(), app.info.processName)); + mName.toString(), app.info.processName)); } else { - name = app.processName; + mName = app.processName; setMessage(res.getString( com.android.internal.R.string.aerr_process, - name.toString())); + mName.toString())); } setCancelable(false); @@ -85,12 +92,33 @@ final class AppErrorDialog extends BaseErrorDialog { DISMISS_TIMEOUT); } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (!ActivityManagerService.IS_USER_BUILD) { + FrameLayout frame = (FrameLayout) findViewById(android.R.id.custom); + Context context = getContext(); + LayoutInflater.from(context).inflate( + com.android.internal.R.layout.app_error_dialog_dont_show_again, frame, true); + ((TextView) frame.findViewById(com.android.internal.R.id.text)).setText( + context.getResources().getString( + com.android.internal.R.string.aerr_process_silence, + mName.toString())); + findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); + } + } + private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { + View view = findViewById(com.android.internal.R.id.checkbox); + final boolean stopReporting = view != null && ((CheckBox) view).isChecked(); synchronized (mService) { if (mProc != null && mProc.crashDialog == AppErrorDialog.this) { mProc.crashDialog = null; } + if (stopReporting) { + mService.stopReportingCrashesLocked(mProc); + } } mResult.set(msg.what); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 4102f37ff386..d0f68f039aa1 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -859,26 +859,35 @@ public final class BatteryStatsService extends IBatteryStats.Stub public boolean isOnBattery() { return mStats.isOnBattery(); } - - public void setBatteryState(int status, int health, int plugType, int level, - int temp, int volt) { - enforceCallingPermission(); - synchronized (mStats) { - final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; - if (mStats.isOnBattery() == onBattery) { - // The battery state has not changed, so we don't need to sync external - // stats immediately. - mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); - return; - } - } - // Sync external stats first as the battery has changed states. If we don't sync - // immediately here, we may not collect the relevant data later. - updateExternalStats("battery-state", UPDATE_ALL); - synchronized (mStats) { - mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); - } + @Override + public void setBatteryState(final int status, final int health, final int plugType, + final int level, final int temp, final int volt) { + enforceCallingPermission(); + + // BatteryService calls us here and we may update external state. It would be wrong + // to block such a low level service like BatteryService on external stats like WiFi. + mHandler.post(new Runnable() { + @Override + public void run() { + synchronized (mStats) { + final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; + if (mStats.isOnBattery() == onBattery) { + // The battery state has not changed, so we don't need to sync external + // stats immediately. + mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); + return; + } + } + + // Sync external stats first as the battery has changed states. If we don't sync + // immediately here, we may not collect the relevant data later. + updateExternalStats("battery-state", UPDATE_ALL); + synchronized (mStats) { + mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); + } + } + }); } public long getAwakeTimeBattery() { @@ -1252,9 +1261,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result); } + // There is some accuracy error in reports so allow 30 milliseconds of error. + final long SAMPLE_ERROR_MILLIS = 30; final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs + result.mControllerTxTimeMs; - if (totalTimeMs > timePeriodMs) { + if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) { StringBuilder sb = new StringBuilder(); sb.append("Total time "); TimeUtils.formatDuration(totalTimeMs, sb); diff --git a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java index 74ba404eb0ee..aca699152e02 100644 --- a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java +++ b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java @@ -20,6 +20,7 @@ import static android.system.OsConstants.*; import android.net.LinkProperties; import android.net.Network; +import android.net.NetworkUtils; import android.net.RouteInfo; import android.os.SystemClock; import android.system.ErrnoException; @@ -79,6 +80,10 @@ import libcore.io.IoUtils; public class NetworkDiagnostics { private static final String TAG = "NetworkDiagnostics"; + private static final InetAddress TEST_DNS4 = NetworkUtils.numericToInetAddress("8.8.8.8"); + private static final InetAddress TEST_DNS6 = NetworkUtils.numericToInetAddress( + "2001:4860:4860::8888"); + // For brevity elsewhere. private static final long now() { return SystemClock.elapsedRealtime(); @@ -156,6 +161,21 @@ public class NetworkDiagnostics { mStartTime = now(); mDeadlineTime = mStartTime + mTimeoutMs; + // Hardcode measurements to TEST_DNS4 and TEST_DNS6 in order to test off-link connectivity. + // We are free to modify mLinkProperties with impunity because ConnectivityService passes us + // a copy and not the original object. It's easier to do it this way because we don't need + // to check whether the LinkProperties already contains these DNS servers because + // LinkProperties#addDnsServer checks for duplicates. + if (mLinkProperties.isReachable(TEST_DNS4)) { + mLinkProperties.addDnsServer(TEST_DNS4); + } + // TODO: we could use mLinkProperties.isReachable(TEST_DNS6) here, because we won't set any + // DNS servers for which isReachable() is false, but since this is diagnostic code, be extra + // careful. + if (mLinkProperties.hasGlobalIPv6Address() || mLinkProperties.hasIPv6DefaultRoute()) { + mLinkProperties.addDnsServer(TEST_DNS6); + } + for (RouteInfo route : mLinkProperties.getRoutes()) { if (route.hasGateway()) { prepareIcmpMeasurement(route.getGateway()); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 8d2687ba9db9..452378ff1e45 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -106,6 +106,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private static final int BRIGHTNESS_RAMP_RATE_FAST = 200; private static final int BRIGHTNESS_RAMP_RATE_SLOW = 40; + private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0; + private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1; + private static final int REPORTED_TO_POLICY_SCREEN_ON = 2; + private final Object mLock = new Object(); private final Context mContext; @@ -231,8 +235,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // The elapsed real time when the screen on was blocked. private long mScreenOnBlockStartRealTime; - // True if we told the window manager policy that the screen was off. - private boolean mReportedScreenOffToPolicy; + // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields. + private int mReportedScreenStateToPolicy; // Remembers whether certain kinds of brightness adjustments // were recently applied so that we can decide how to transition. @@ -699,6 +703,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean finished = ready && !mScreenBrightnessRampAnimator.isAnimating(); + // Notify policy about screen turned on. + if (ready && state != Display.STATE_OFF + && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_ON; + mWindowManagerPolicy.screenTurnedOn(); + } + // Grab a wake lock if we have unfinished business. if (!finished && !mUnfinishedBusiness) { if (DEBUG) { @@ -776,12 +787,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // it is only removed once the window manager tells us that the activity has // finished drawing underneath. final boolean isOff = (state == Display.STATE_OFF); - if (isOff && !mReportedScreenOffToPolicy && !mScreenOffBecauseOfProximity) { - mReportedScreenOffToPolicy = true; + if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF + && !mScreenOffBecauseOfProximity) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF; unblockScreenOn(); mWindowManagerPolicy.screenTurnedOff(); - } else if (!isOff && mReportedScreenOffToPolicy) { - mReportedScreenOffToPolicy = false; + } else if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) { + mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_ON; if (mPowerState.getColorFadeLevel() == 0.0f) { blockScreenOn(); } else { @@ -1095,7 +1107,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(" mAppliedLowPower=" + mAppliedLowPower); pw.println(" mPendingScreenOnUnblocker=" + mPendingScreenOnUnblocker); pw.println(" mPendingScreenOff=" + mPendingScreenOff); - pw.println(" mReportedScreenOffToPolicy=" + mReportedScreenOffToPolicy); + pw.println(" mReportedToPolicy=" + reportedToPolicyToString(mReportedScreenStateToPolicy)); pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" + mScreenBrightnessRampAnimator.isAnimating()); @@ -1132,6 +1144,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } + private static String reportedToPolicyToString(int state) { + switch (state) { + case REPORTED_TO_POLICY_SCREEN_OFF: + return "REPORTED_TO_POLICY_SCREEN_OFF"; + case REPORTED_TO_POLICY_SCREEN_TURNING_ON: + return "REPORTED_TO_POLICY_SCREEN_TURNING_ON"; + case REPORTED_TO_POLICY_SCREEN_ON: + return "REPORTED_TO_POLICY_SCREEN_ON"; + default: + return Integer.toString(state); + } + } + private static Spline createAutoBrightnessSpline(int[] lux, int[] brightness) { try { final int n = brightness.length; diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index 81056757fb0a..206cc8a256d8 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -65,7 +65,7 @@ final class DreamController { private final Intent mDreamingStoppedIntent = new Intent(Intent.ACTION_DREAMING_STOPPED) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - private final Intent mCloseNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + private final Intent mCloseNotificationShadeIntent; private DreamRecord mCurrentDream; @@ -92,6 +92,8 @@ final class DreamController { mHandler = handler; mListener = listener; mIWindowManager = WindowManagerGlobal.getWindowManagerService(); + mCloseNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + mCloseNotificationShadeIntent.putExtra("reason", "dream"); } public void dump(PrintWriter pw) { diff --git a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java index 607805bf8190..55222dc305c3 100644 --- a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java +++ b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java @@ -20,8 +20,10 @@ import com.android.server.ServiceWatcher; import android.content.Context; import android.hardware.location.ActivityRecognitionHardware; +import android.hardware.location.IActivityRecognitionHardwareClient; import android.hardware.location.IActivityRecognitionHardwareWatcher; import android.os.Handler; +import android.os.IBinder; import android.os.RemoteException; import android.util.Log; @@ -34,21 +36,24 @@ public class ActivityRecognitionProxy { private static final String TAG = "ActivityRecognitionProxy"; private final ServiceWatcher mServiceWatcher; - private final ActivityRecognitionHardware mActivityRecognitionHardware; + private final boolean mIsSupported; + private final ActivityRecognitionHardware mInstance; private ActivityRecognitionProxy( Context context, Handler handler, + boolean activityRecognitionHardwareIsSupported, ActivityRecognitionHardware activityRecognitionHardware, int overlaySwitchResId, int defaultServicePackageNameResId, int initialPackageNameResId) { - mActivityRecognitionHardware = activityRecognitionHardware; + mIsSupported = activityRecognitionHardwareIsSupported; + mInstance = activityRecognitionHardware; Runnable newServiceWork = new Runnable() { @Override public void run() { - bindProvider(mActivityRecognitionHardware); + bindProvider(); } }; @@ -72,6 +77,7 @@ public class ActivityRecognitionProxy { public static ActivityRecognitionProxy createAndBind( Context context, Handler handler, + boolean activityRecognitionHardwareIsSupported, ActivityRecognitionHardware activityRecognitionHardware, int overlaySwitchResId, int defaultServicePackageNameResId, @@ -79,6 +85,7 @@ public class ActivityRecognitionProxy { ActivityRecognitionProxy activityRecognitionProxy = new ActivityRecognitionProxy( context, handler, + activityRecognitionHardwareIsSupported, activityRecognitionHardware, overlaySwitchResId, defaultServicePackageNameResId, @@ -89,25 +96,58 @@ public class ActivityRecognitionProxy { Log.e(TAG, "ServiceWatcher could not start."); return null; } - return activityRecognitionProxy; } /** * Helper function to bind the FusedLocationHardware to the appropriate FusedProvider instance. */ - private void bindProvider(ActivityRecognitionHardware activityRecognitionHardware) { - IActivityRecognitionHardwareWatcher watcher = - IActivityRecognitionHardwareWatcher.Stub.asInterface(mServiceWatcher.getBinder()); - if (watcher == null) { - Log.e(TAG, "No provider instance found on connection."); + private void bindProvider() { + IBinder binder = mServiceWatcher.getBinder(); + if (binder == null) { + Log.e(TAG, "Null binder found on connection."); return; } - + String descriptor; try { - watcher.onInstanceChanged(mActivityRecognitionHardware); + descriptor = binder.getInterfaceDescriptor(); } catch (RemoteException e) { - Log.e(TAG, "Error delivering hardware interface.", e); + Log.e(TAG, "Unable to get interface descriptor.", e); + return; + } + + if (IActivityRecognitionHardwareWatcher.class.getCanonicalName().equals(descriptor)) { + IActivityRecognitionHardwareWatcher watcher = + IActivityRecognitionHardwareWatcher.Stub.asInterface(binder); + if (watcher == null) { + Log.e(TAG, "No watcher found on connection."); + return; + } + if (mInstance == null) { + // to keep backwards compatibility do not update the watcher when there is no + // instance available, or it will cause an NPE + Log.d(TAG, "AR HW instance not available, binding will be a no-op."); + return; + } + try { + watcher.onInstanceChanged(mInstance); + } catch (RemoteException e) { + Log.e(TAG, "Error delivering hardware interface to watcher.", e); + } + } else if (IActivityRecognitionHardwareClient.class.getCanonicalName().equals(descriptor)) { + IActivityRecognitionHardwareClient client = + IActivityRecognitionHardwareClient.Stub.asInterface(binder); + if (client == null) { + Log.e(TAG, "No client found on connection."); + return; + } + try { + client.onAvailabilityChanged(mIsSupported, mInstance); + } catch (RemoteException e) { + Log.e(TAG, "Error delivering hardware interface to client.", e); + } + } else { + Log.e(TAG, "Invalid descriptor found on connection: " + descriptor); } } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 395aa275f412..cd982d32d45d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1520,9 +1520,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } synchronized (mRulesLock) { - final int oldPolicy = mUidPolicy.get(uid, POLICY_NONE); - if (oldPolicy != policy) { - setUidPolicyUncheckedLocked(uid, policy, true); + final long token = Binder.clearCallingIdentity(); + try { + final int oldPolicy = mUidPolicy.get(uid, POLICY_NONE); + if (oldPolicy != policy) { + setUidPolicyUncheckedLocked(uid, policy, true); + } + } finally { + Binder.restoreCallingIdentity(token); } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5af59b42201b..b2ddc2f4072b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -321,6 +321,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_BOOTING = 1<<8; static final int SCAN_TRUSTED_OVERLAY = 1<<9; static final int SCAN_DELETE_DATA_ON_FAILURES = 1<<10; + static final int SCAN_REPLACING = 1<<11; static final int SCAN_REQUIRE_KNOWN = 1<<12; static final int SCAN_MOVE = 1<<13; static final int SCAN_INITIAL = 1<<14; @@ -3117,7 +3118,13 @@ public class PackageManagerService extends IPackageManager.Stub { final PackageParser.Package p = mPackages.get(pkgName); if (p != null && p.mExtras != null) { final PackageSetting ps = (PackageSetting) p.mExtras; - if (ps.getPermissionsState().hasPermission(permName, userId)) { + final PermissionsState permissionsState = ps.getPermissionsState(); + if (permissionsState.hasPermission(permName, userId)) { + return PackageManager.PERMISSION_GRANTED; + } + // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION + if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState + .hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) { return PackageManager.PERMISSION_GRANTED; } } @@ -3138,13 +3145,25 @@ public class PackageManagerService extends IPackageManager.Stub { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj != null) { final SettingBase ps = (SettingBase) obj; - if (ps.getPermissionsState().hasPermission(permName, userId)) { + final PermissionsState permissionsState = ps.getPermissionsState(); + if (permissionsState.hasPermission(permName, userId)) { + return PackageManager.PERMISSION_GRANTED; + } + // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION + if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState + .hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) { return PackageManager.PERMISSION_GRANTED; } } else { ArraySet<String> perms = mSystemPermissions.get(uid); - if (perms != null && perms.contains(permName)) { - return PackageManager.PERMISSION_GRANTED; + if (perms != null) { + if (perms.contains(permName)) { + return PackageManager.PERMISSION_GRANTED; + } + if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && perms + .contains(Manifest.permission.ACCESS_FINE_LOCATION)) { + return PackageManager.PERMISSION_GRANTED; + } } } } @@ -7113,6 +7132,14 @@ public class PackageManagerService extends IPackageManager.Stub { } } + // Request the ActivityManager to kill the process(only for existing packages) + // so that we do not end up in a confused state while the user is still using the older + // version of the application while the new one gets installed. + if ((scanFlags & SCAN_REPLACING) != 0) { + killApplication(pkg.applicationInfo.packageName, + pkg.applicationInfo.uid, "replace pkg"); + } + // Also need to kill any apps that are dependent on the library. if (clientLibPkgs != null) { for (int i=0; i<clientLibPkgs.size(); i++) { @@ -11750,7 +11777,6 @@ public class PackageManagerService extends IPackageManager.Stub { final String pkgName = pkg.packageName; final int[] allUsers; final boolean[] perUserInstalled; - final boolean weFroze; // First find the old package info and check signatures synchronized(mPackages) { @@ -11780,35 +11806,15 @@ public class PackageManagerService extends IPackageManager.Stub { for (int i = 0; i < allUsers.length; i++) { perUserInstalled[i] = ps != null ? ps.getInstalled(allUsers[i]) : false; } - - // Mark the app as frozen to prevent launching during the upgrade - // process, and then kill all running instances - if (!ps.frozen) { - ps.frozen = true; - weFroze = true; - } else { - weFroze = false; - } } - // Now that we're guarded by frozen state, kill app during upgrade - killApplication(pkgName, oldPackage.applicationInfo.uid, "replace pkg"); - - try { - boolean sysPkg = (isSystemApp(oldPackage)); - if (sysPkg) { - replaceSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); - } else { - replaceNonSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); - } - } finally { - // Regardless of success or failure of upgrade steps above, always - // unfreeze the package if we froze it - if (weFroze) { - unfreezePackage(pkgName); - } + boolean sysPkg = (isSystemApp(oldPackage)); + if (sysPkg) { + replaceSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, + user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); + } else { + replaceNonSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, + user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); } } @@ -11938,6 +11944,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } + killApplication(packageName, oldPkg.applicationInfo.uid, "replace sys pkg"); + res.removedInfo.uid = oldPkg.applicationInfo.uid; res.removedInfo.removedPackage = packageName; // Remove existing system package @@ -12327,7 +12335,7 @@ public class PackageManagerService extends IPackageManager.Stub { startIntentFilterVerifications(args.user.getIdentifier(), replace, pkg); if (replace) { - replacePackageLI(pkg, parseFlags, scanFlags, args.user, + replacePackageLI(pkg, parseFlags, scanFlags | SCAN_REPLACING, args.user, installerPackageName, volumeUuid, res); } else { installNewPackageLI(pkg, parseFlags, scanFlags | SCAN_DELETE_DATA_ON_FAILURES, diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index eb2109802181..c75ef875b396 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -544,6 +544,7 @@ public class UserManagerService extends IUserManager.Stub { @Override public void setUserRestriction(String key, boolean value, int userId) { + checkManageUsersPermission("setUserRestriction"); synchronized (mPackagesLock) { if (!SYSTEM_CONTROLLED_RESTRICTIONS.contains(key)) { Bundle restrictions = getUserRestrictions(userId); diff --git a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java index fef1e57504cd..e6ec6a67fe3a 100644 --- a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java +++ b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java @@ -72,6 +72,9 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, /* 1 means increasing, -1 means decreasing */ private int mYOffsetDirection = 1; + private int mAppliedBurnInXOffset = 0; + private int mAppliedBurnInYOffset = 0; + private final AlarmManager mAlarmManager; private final PendingIntent mBurnInProtectionIntent; private final DisplayManagerInternal mDisplayManagerInternal; @@ -139,6 +142,8 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, mFirstUpdate = false; } else { adjustOffsets(); + mAppliedBurnInXOffset = mLastBurnInXOffset; + mAppliedBurnInYOffset = mLastBurnInYOffset; mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), mLastBurnInXOffset, mLastBurnInYOffset); } @@ -258,6 +263,8 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, @Override public void onAnimationEnd(Animator animator) { if (animator == mCenteringAnimator && !mBurnInProtectionActive) { + mAppliedBurnInXOffset = 0; + mAppliedBurnInYOffset = 0; // No matter how the animation finishes, we want to zero the offsets. mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), 0, 0); } @@ -276,7 +283,7 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, if (!mBurnInProtectionActive) { final float value = (Float) valueAnimator.getAnimatedValue(); mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), - (int) (mLastBurnInXOffset * value), (int) (mLastBurnInYOffset * value)); + (int) (mAppliedBurnInXOffset * value), (int) (mAppliedBurnInYOffset * value)); } } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a6c247fbf2d6..b25fc873a974 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -251,7 +251,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** Amount of time (in milliseconds) to wait for windows drawn before powering on. */ - static final int WAITING_FOR_DRAWN_TIMEOUT = 500; + static final int WAITING_FOR_DRAWN_TIMEOUT = 1000; /** * Lock protecting internal state. Must not call out into window @@ -2498,6 +2498,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { return isKeyguard ? -1 : R.anim.dock_top_enter; } } else if (win == mNavigationBar) { + if (win.getAttrs().windowAnimations != 0) { + return 0; + } // This can be on either the bottom or the right. if (mNavigationBarOnBottom) { if (transit == TRANSIT_EXIT @@ -5585,6 +5588,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerDrawComplete = false; mScreenOnListener = null; updateOrientationListenerLp(); + + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurnedOff(); + } } } @@ -5610,6 +5617,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // Called on the DisplayManager's DisplayPowerController thread. + @Override + public void screenTurnedOn() { + synchronized (mLock) { + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurnedOn(); + } + } + } + private void finishWindowsDrawn() { synchronized (mLock) { if (!mScreenOnEarly || mWindowManagerDrawComplete) { diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 0f3a199e79e8..8e3ee333a941 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -144,6 +144,7 @@ public class KeyguardServiceDelegate { mKeyguardService.onStartedWakingUp(); mKeyguardService.onScreenTurningOn( new KeyguardShowDelegate(mDrawnListenerWhenConnect)); + mKeyguardService.onScreenTurnedOn(); mDrawnListenerWhenConnect = null; } if (mKeyguardState.bootCompleted) { @@ -229,6 +230,13 @@ public class KeyguardServiceDelegate { } } + public void onScreenTurnedOff() { + if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "onScreenTurnedOff()"); + mKeyguardService.onScreenTurnedOff(); + } + } + public void onScreenTurningOn(final DrawnListener drawnListener) { if (mKeyguardService != null) { if (DEBUG) Log.v(TAG, "onScreenTurnedOn(showListener = " + drawnListener + ")"); @@ -243,6 +251,13 @@ public class KeyguardServiceDelegate { } } + public void onScreenTurnedOn() { + if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "onScreenTurnedOn()"); + mKeyguardService.onScreenTurnedOn(); + } + } + public void onStartedGoingToSleep(int why) { if (mKeyguardService != null) { mKeyguardService.onStartedGoingToSleep(why); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 5810a4529bce..cd88b664e2f8 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -141,6 +141,24 @@ public class KeyguardServiceWrapper implements IKeyguardService { } } + @Override + public void onScreenTurnedOn() { + try { + mService.onScreenTurnedOn(); + } catch (RemoteException e) { + Slog.w(TAG , "Remote Exception", e); + } + } + + @Override + public void onScreenTurnedOff() { + try { + mService.onScreenTurnedOff(); + } catch (RemoteException e) { + Slog.w(TAG , "Remote Exception", e); + } + } + @Override // Binder interface public void setKeyguardEnabled(boolean enabled) { try { diff --git a/services/core/java/com/android/server/updates/ApnDbInstallReceiver.java b/services/core/java/com/android/server/updates/ApnDbInstallReceiver.java new file mode 100644 index 000000000000..3b6f9d6c135c --- /dev/null +++ b/services/core/java/com/android/server/updates/ApnDbInstallReceiver.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.updates; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.provider.Telephony; + +public class ApnDbInstallReceiver extends ConfigUpdateInstallReceiver { + + private static final Uri UPDATE_APN_DB = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, + "update_db"); + + public ApnDbInstallReceiver() { + super("/data/misc/", "apns-conf.xml", "metadata/", "version"); + } + + @Override + protected void postInstall(Context context, Intent intent) { + ContentResolver resolver = context.getContentResolver(); + resolver.delete(UPDATE_APN_DB, null, null); + } +} diff --git a/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java index ba1231f7530c..da1df1accdb0 100644 --- a/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java +++ b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java @@ -21,12 +21,13 @@ import android.net.DhcpResults; import android.net.LinkAddress; import android.system.OsConstants; import android.test.suitebuilder.annotation.SmallTest; -import junit.framework.TestCase; +import com.android.internal.util.HexDump; import java.net.Inet4Address; import java.nio.ByteBuffer; import java.util.ArrayList; +import junit.framework.TestCase; import libcore.util.HexEncoding; import static android.net.dhcp.DhcpPacket.*; @@ -370,4 +371,69 @@ public class DhcpPacketTest extends TestCase { assertDhcpResults("172.17.152.118/16", "172.17.1.1", "172.17.1.1", null, "1.1.1.1", null, 43200, false, dhcpResults); } + + @SmallTest + public void testBug2111() throws Exception { + final ByteBuffer packet = ByteBuffer.wrap(HexEncoding.decode(( + // IP header. + "4500014c00000000ff119beac3eaf3880a3f5d04" + + // UDP header. TODO: fix invalid checksum (due to MAC address obfuscation). + "0043004401387464" + + // BOOTP header. + "0201060002554812000a0000000000000a3f5d040000000000000000" + + // MAC address. + "00904c00000000000000000000000000" + + // Server name. + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + // File. + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + // Options. + "638253633501023604c00002fe33040000bfc60104fffff00003040a3f50010608c0000201c0000202" + + "0f0f646f6d61696e3132332e636f2e756b0000000000ff00000000" + ).toCharArray(), false)); + + DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L3); + assertTrue(offerPacket instanceof DhcpOfferPacket); + DhcpResults dhcpResults = offerPacket.toDhcpResults(); + assertDhcpResults("10.63.93.4/20", "10.63.80.1", "192.0.2.1,192.0.2.2", + "domain123.co.uk", "192.0.2.254", null, 49094, false, dhcpResults); + } + + @SmallTest + public void testBug2136() throws Exception { + final ByteBuffer packet = ByteBuffer.wrap(HexEncoding.decode(( + // Ethernet header. + "bcf5ac000000d0c7890000000800" + + // IP header. + "4500014c00000000ff119beac3eaf3880a3f5d04" + + // UDP header. TODO: fix invalid checksum (due to MAC address obfuscation). + "0043004401387574" + + // BOOTP header. + "0201060163339a3000050000000000000a209ecd0000000000000000" + + // MAC address. + "bcf5ac00000000000000000000000000" + + // Server name. + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + // File. + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + // Options. + "6382536335010236040a20ff80330400001c200104fffff00003040a20900106089458413494584135" + + "0f0b6c616e63732e61632e756b000000000000000000ff00000000" + ).toCharArray(), false)); + + DhcpPacket offerPacket = DhcpPacket.decodeFullPacket(packet, ENCAP_L2); + assertTrue(offerPacket instanceof DhcpOfferPacket); + assertEquals("BCF5AC000000", HexDump.toHexString(offerPacket.getClientMac())); + DhcpResults dhcpResults = offerPacket.toDhcpResults(); + assertDhcpResults("10.32.158.205/20", "10.32.144.1", "148.88.65.52,148.88.65.53", + "lancs.ac.uk", "10.32.255.128", null, 7200, false, dhcpResults); + } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index a4facc1cb4f9..28520be8b7dc 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -72,7 +72,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne public void onReceive(Context context, Intent intent) { if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { String reason = intent.getStringExtra("reason"); - if (!CLOSE_REASON_VOICE_INTERACTION.equals(reason)) { + if (!CLOSE_REASON_VOICE_INTERACTION.equals(reason) && !"dream".equals(reason)) { synchronized (mLock) { if (mActiveSession != null && mActiveSession.mSession != null) { try { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java index 47a9fcd90ed6..04d6d98fe2b2 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java @@ -214,7 +214,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection { disabledContext |= getUserDisabledShowContextLocked(); boolean structureEnabled = isAssistDataAllowed && (disabledContext&VoiceInteractionSession.SHOW_WITH_ASSIST) == 0; - boolean screenshotEnabled = isAssistDataAllowed + boolean screenshotEnabled = isAssistDataAllowed && structureEnabled && (disabledContext&VoiceInteractionSession.SHOW_WITH_SCREENSHOT) == 0; mShowArgs = args; mShowFlags = flags; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 2ab6d56b53b4..26477ce38e2d 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -257,7 +257,16 @@ public abstract class Connection extends Conferenceable { * The value for this key should be an ArrayList of Strings. * @hide */ - public static final String EXTRA_CALL_HISTORY_INFO = "EXTRA_CALL_HISTORY_INFO"; + public static final String EXTRA_CALL_HISTORY_INFO = "android.telecom.EXTRA_CALL_HISTORY_INFO"; + + /** + * Connection {@link #mExtras} key used to store a child number associated with the current + * connection. Used to communicate to the user interface that the connection was received via + * a child address (in telephony phone number) associated with the {@link PhoneAccount}'s + * primary address. + * @hide + */ + public static final String EXTRA_CHILD_ADDRESS = "android.telecom.EXTRA_CHILD_ADDRESS"; // Flag controlling whether PII is emitted into the logs private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index df6fa2e1b391..cdb0bf257baa 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -112,6 +112,15 @@ public final class PhoneAccount implements Parcelable { public static final int CAPABILITY_MULTI_USER = 0x20; /** + * Flag indicating that this {@code PhoneAccount} supports a subject for Calls. This means a + * caller is able to specify a short subject line for an outgoing call. A capable receiving + * device displays the call subject on the incoming call screen. + * <p> + * See {@link #getCapabilities} + */ + public static final int CAPABILITY_CALL_SUBJECT = 0x40; + + /** * URI scheme for telephone number URIs. */ public static final String SCHEME_TEL = "tel"; diff --git a/tests/AccessibilityEventsLogger/src/com/android/tests/accessibilityeventslogger/AELogger.java b/tests/AccessibilityEventsLogger/src/com/android/tests/accessibilityeventlogger/AELogger.java index 27d8eb9063ee..392c2a4cdfd7 100644 --- a/tests/AccessibilityEventsLogger/src/com/android/tests/accessibilityeventslogger/AELogger.java +++ b/tests/AccessibilityEventsLogger/src/com/android/tests/accessibilityeventlogger/AELogger.java @@ -12,7 +12,7 @@ * the License. */ -package com.android.tests.accessibilityeventslogger; +package com.android.tests.accessibilityeventlogger; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; @@ -23,7 +23,7 @@ import android.widget.Toast; import java.util.Locale; public class AELogger extends AccessibilityService { - private static final String TAG = AELogger.class.getCanonicalName(); + private static final String TAG = AELogger.class.getSimpleName(); private static final int TOAST_EVENT_TYPES = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_LONG_CLICKED; @@ -42,8 +42,10 @@ public class AELogger extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { - final String eventClass = event.getClassName().toString(); - final String eventText = String.valueOf(event.getText()).toLowerCase(Locale.getDefault()); + final String eventClass = event.getClassName() != null + ? event.getClassName().toString() : null; + final String eventText = event.getText() != null + ? String.valueOf(event.getText()).toLowerCase(Locale.getDefault()) : null; final String eventType = AccessibilityEvent.eventTypeToString(event.getEventType()); Log.d(TAG, String.format( diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java index c0a67c189881..6e3694b345e9 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java @@ -72,6 +72,7 @@ public class MainInteractionSession extends VoiceInteractionSession VoiceInteractor.PickOptionRequest.Option[] mPendingOptions; CharSequence mPendingPrompt; Request mPendingRequest; + int mCurrentTask = -1; MainInteractionSession(Context context) { super(context); @@ -314,6 +315,27 @@ public class MainInteractionSession extends VoiceInteractionSession } @Override + public void onTaskStarted(Intent intent, int taskId) { + super.onTaskStarted(intent, taskId); + mCurrentTask = taskId; + } + + @Override + public void onTaskFinished(Intent intent, int taskId) { + super.onTaskFinished(intent, taskId); + if (mCurrentTask == taskId) { + mCurrentTask = -1; + } + } + + @Override + public void onLockscreenShown() { + if (mCurrentTask < 0) { + hide(); + } + } + + @Override public boolean[] onGetSupportedCommands(String[] commands) { boolean[] res = new boolean[commands.length]; for (int i=0; i<commands.length; i++) { |