diff options
369 files changed, 12774 insertions, 1541 deletions
diff --git a/api/current.txt b/api/current.txt index ae343cdc5e8b..649d7fa79242 100644 --- a/api/current.txt +++ b/api/current.txt @@ -104,6 +104,7 @@ package android { field public static final java.lang.String READ_WRITE_CONTACT_METADATA = "android.permission.READ_WRITE_CONTACT_METADATA"; field public static final java.lang.String REBOOT = "android.permission.REBOOT"; field public static final java.lang.String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED"; + field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST"; field public static final java.lang.String RECEIVE_MMS = "android.permission.RECEIVE_MMS"; field public static final java.lang.String RECEIVE_SMS = "android.permission.RECEIVE_SMS"; field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH"; @@ -22997,7 +22998,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23043,7 +23044,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -58015,8 +58016,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59721,6 +59725,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/api/system-current.txt b/api/system-current.txt index bcd39fe3272e..3c3054eaa5b6 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -21082,6 +21082,7 @@ package android.media { public final class AudioAttributes implements android.os.Parcelable { method public int describeContents(); method public int getAllFlags(); + method public android.os.Bundle getBundle(); method public int getCapturePreset(); method public int getContentType(); method public int getFlags(); @@ -21120,6 +21121,7 @@ package android.media { public static class AudioAttributes.Builder { ctor public AudioAttributes.Builder(); ctor public AudioAttributes.Builder(android.media.AudioAttributes); + method public android.media.AudioAttributes.Builder addBundle(android.os.Bundle); method public android.media.AudioAttributes build(); method public android.media.AudioAttributes.Builder setCapturePreset(int); method public android.media.AudioAttributes.Builder setContentType(int); @@ -24748,7 +24750,7 @@ package android.media.tv { method public abstract void onConnect(android.net.Uri); method public void onConnect(android.net.Uri, android.os.Bundle); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -24800,7 +24802,7 @@ package android.media.tv { method public void connect(java.lang.String, android.net.Uri, android.os.Bundle); method public void disconnect(); method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -26233,12 +26235,18 @@ package android.net.wifi { } public class RttManager { + method public void disableResponder(android.net.wifi.RttManager.ResponderCallback); + method public void enableResponder(android.net.wifi.RttManager.ResponderCallback); method public deprecated android.net.wifi.RttManager.Capabilities getCapabilities(); method public android.net.wifi.RttManager.RttCapabilities getRttCapabilities(); method public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener); method public void stopRanging(android.net.wifi.RttManager.RttListener); field public static final int BASE = 160256; // 0x27200 field public static final int CMD_OP_ABORTED = 160260; // 0x27204 + field public static final int CMD_OP_DISABLE_RESPONDER = 160262; // 0x27206 + field public static final int CMD_OP_ENABLE_RESPONDER = 160261; // 0x27205 + field public static final int CMD_OP_ENALBE_RESPONDER_FAILED = 160264; // 0x27208 + field public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED = 160263; // 0x27207 field public static final int CMD_OP_FAILED = 160258; // 0x27202 field public static final int CMD_OP_START_RANGING = 160256; // 0x27200 field public static final int CMD_OP_STOP_RANGING = 160257; // 0x27201 @@ -26247,6 +26255,7 @@ package android.net.wifi { field public static final int PREAMBLE_HT = 2; // 0x2 field public static final int PREAMBLE_LEGACY = 1; // 0x1 field public static final int PREAMBLE_VHT = 4; // 0x4 + field public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa field public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd field public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc field public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe @@ -26314,6 +26323,25 @@ package android.net.wifi { field public android.net.wifi.RttManager.RttResult[] mResults; } + public static abstract class RttManager.ResponderCallback { + ctor public RttManager.ResponderCallback(); + method public abstract void onResponderEnableFailure(int); + method public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig); + } + + public static class RttManager.ResponderConfig implements android.os.Parcelable { + ctor public RttManager.ResponderConfig(); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR; + field public int centerFreq0; + field public int centerFreq1; + field public int channelWidth; + field public int frequency; + field public java.lang.String macAddress; + field public int preamble; + } + public static class RttManager.RttCapabilities implements android.os.Parcelable { ctor public RttManager.RttCapabilities(); method public int describeContents(); @@ -26323,6 +26351,7 @@ package android.net.wifi { field public boolean lcrSupported; field public boolean oneSidedRttSupported; field public int preambleSupported; + field public boolean responderSupported; field public deprecated boolean supportedPeerType; field public deprecated boolean supportedType; field public boolean twoSided11McRttSupported; @@ -31502,6 +31531,51 @@ package android.os { ctor public TransactionTooLargeException(java.lang.String); } + public class UpdateEngine { + ctor public UpdateEngine(); + method public void applyPayload(java.lang.String, long, long, java.lang.String[]) throws android.os.RemoteException; + method public boolean bind(android.os.UpdateEngineCallback, android.os.Handler) throws android.os.RemoteException; + method public boolean bind(android.os.UpdateEngineCallback) throws android.os.RemoteException; + method public void cancel() throws android.os.RemoteException; + method public void resume() throws android.os.RemoteException; + method public void suspend() throws android.os.RemoteException; + } + + public static final class UpdateEngine.ErrorCodeConstants { + ctor public UpdateEngine.ErrorCodeConstants(); + field public static final int DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 12; // 0xc + field public static final int DOWNLOAD_TRANSFER_ERROR = 9; // 0x9 + field public static final int ERROR = 1; // 0x1 + field public static final int FILESYSTEM_COPIER_ERROR = 4; // 0x4 + field public static final int INSTALL_DEVICE_OPEN_ERROR = 7; // 0x7 + field public static final int KERNEL_DEVICE_OPEN_ERROR = 8; // 0x8 + field public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10; // 0xa + field public static final int PAYLOAD_MISMATCHED_TYPE_ERROR = 6; // 0x6 + field public static final int PAYLOAD_SIZE_MISMATCH_ERROR = 11; // 0xb + field public static final int POST_INSTALL_RUNNER_ERROR = 5; // 0x5 + field public static final int SUCCESS = 0; // 0x0 + } + + public static final class UpdateEngine.UpdateStatusConstants { + ctor public UpdateEngine.UpdateStatusConstants(); + field public static final int ATTEMPTING_ROLLBACK = 8; // 0x8 + field public static final int CHECKING_FOR_UPDATE = 1; // 0x1 + field public static final int DISABLED = 9; // 0x9 + field public static final int DOWNLOADING = 3; // 0x3 + field public static final int FINALIZING = 5; // 0x5 + field public static final int IDLE = 0; // 0x0 + field public static final int REPORTING_ERROR_EVENT = 7; // 0x7 + field public static final int UPDATED_NEED_REBOOT = 6; // 0x6 + field public static final int UPDATE_AVAILABLE = 2; // 0x2 + field public static final int VERIFYING = 4; // 0x4 + } + + public abstract class UpdateEngineCallback { + ctor public UpdateEngineCallback(); + method public abstract void onPayloadApplicationComplete(int); + method public abstract void onStatusUpdate(int, float); + } + public final class UserHandle implements android.os.Parcelable { ctor public UserHandle(android.os.Parcel); method public int describeContents(); @@ -61030,8 +61104,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -62736,6 +62813,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/api/test-current.txt b/api/test-current.txt index c1cd2750424e..8fbcff9218f1 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -104,6 +104,7 @@ package android { field public static final java.lang.String READ_WRITE_CONTACT_METADATA = "android.permission.READ_WRITE_CONTACT_METADATA"; field public static final java.lang.String REBOOT = "android.permission.REBOOT"; field public static final java.lang.String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED"; + field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST"; field public static final java.lang.String RECEIVE_MMS = "android.permission.RECEIVE_MMS"; field public static final java.lang.String RECEIVE_SMS = "android.permission.RECEIVE_SMS"; field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH"; @@ -23006,7 +23007,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23052,7 +23053,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } @@ -58032,8 +58033,11 @@ package java.util { method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); + method public static boolean isNull(java.lang.Object); + method public static boolean nonNull(java.lang.Object); method public static T requireNonNull(T); method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -59738,6 +59742,217 @@ package java.util.concurrent.locks { } +package java.util.function { + + public abstract interface BiConsumer { + method public abstract void accept(T, U); + method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>); + } + + public abstract interface BiFunction { + method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T, U); + } + + public abstract interface BiPredicate { + method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>); + method public default java.util.function.BiPredicate<T, U> negate(); + method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>); + method public abstract boolean test(T, U); + } + + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>); + method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>); + } + + public abstract interface BooleanSupplier { + method public abstract boolean getAsBoolean(); + } + + public abstract interface Consumer { + method public abstract void accept(T); + method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>); + } + + public abstract interface DoubleBinaryOperator { + method public abstract double applyAsDouble(double, double); + } + + public abstract interface DoubleConsumer { + method public abstract void accept(double); + method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); + } + + public abstract interface DoubleFunction { + method public abstract R apply(double); + } + + public abstract interface DoublePredicate { + method public default java.util.function.DoublePredicate and(java.util.function.DoublePredicate); + method public default java.util.function.DoublePredicate negate(); + method public default java.util.function.DoublePredicate or(java.util.function.DoublePredicate); + method public abstract boolean test(double); + } + + public abstract interface DoubleSupplier { + method public abstract double getAsDouble(); + } + + public abstract interface DoubleToIntFunction { + method public abstract int applyAsInt(double); + } + + public abstract interface DoubleToLongFunction { + method public abstract long applyAsLong(double); + } + + public abstract interface DoubleUnaryOperator { + method public default java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator); + method public abstract double applyAsDouble(double); + method public default java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator); + method public static java.util.function.DoubleUnaryOperator identity(); + } + + public abstract interface Function { + method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>); + method public abstract R apply(T); + method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>); + method public static java.util.function.Function<T, T> identity(); + } + + public abstract interface IntBinaryOperator { + method public abstract int applyAsInt(int, int); + } + + public abstract interface IntConsumer { + method public abstract void accept(int); + method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); + } + + public abstract interface IntFunction { + method public abstract R apply(int); + } + + public abstract interface IntPredicate { + method public default java.util.function.IntPredicate and(java.util.function.IntPredicate); + method public default java.util.function.IntPredicate negate(); + method public default java.util.function.IntPredicate or(java.util.function.IntPredicate); + method public abstract boolean test(int); + } + + public abstract interface IntSupplier { + method public abstract int getAsInt(); + } + + public abstract interface IntToDoubleFunction { + method public abstract double applyAsDouble(int); + } + + public abstract interface IntToLongFunction { + method public abstract long applyAsLong(int); + } + + public abstract interface IntUnaryOperator { + method public default java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator); + method public abstract int applyAsInt(int); + method public default java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator); + method public static java.util.function.IntUnaryOperator identity(); + } + + public abstract interface LongBinaryOperator { + method public abstract long applyAsLong(long, long); + } + + public abstract interface LongConsumer { + method public abstract void accept(long); + method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); + } + + public abstract interface LongFunction { + method public abstract R apply(long); + } + + public abstract interface LongPredicate { + method public default java.util.function.LongPredicate and(java.util.function.LongPredicate); + method public default java.util.function.LongPredicate negate(); + method public default java.util.function.LongPredicate or(java.util.function.LongPredicate); + method public abstract boolean test(long); + } + + public abstract interface LongSupplier { + method public abstract long getAsLong(); + } + + public abstract interface LongToDoubleFunction { + method public abstract double applyAsDouble(long); + } + + public abstract interface LongToIntFunction { + method public abstract int applyAsInt(long); + } + + public abstract interface LongUnaryOperator { + method public default java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator); + method public abstract long applyAsLong(long); + method public default java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator); + method public static java.util.function.LongUnaryOperator identity(); + } + + public abstract interface ObjDoubleConsumer { + method public abstract void accept(T, double); + } + + public abstract interface ObjIntConsumer { + method public abstract void accept(T, int); + } + + public abstract interface ObjLongConsumer { + method public abstract void accept(T, long); + } + + public abstract interface Predicate { + method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>); + method public static java.util.function.Predicate<T> isEqual(java.lang.Object); + method public default java.util.function.Predicate<T> negate(); + method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>); + method public abstract boolean test(T); + } + + public abstract interface Supplier { + method public abstract T get(); + } + + public abstract interface ToDoubleBiFunction { + method public abstract double applyAsDouble(T, U); + } + + public abstract interface ToDoubleFunction { + method public abstract double applyAsDouble(T); + } + + public abstract interface ToIntBiFunction { + method public abstract int applyAsInt(T, U); + } + + public abstract interface ToIntFunction { + method public abstract int applyAsInt(T); + } + + public abstract interface ToLongBiFunction { + method public abstract long applyAsLong(T, U); + } + + public abstract interface ToLongFunction { + method public abstract long applyAsLong(T); + } + + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator<T> identity(); + } + +} + package java.util.jar { public class Attributes implements java.lang.Cloneable java.util.Map { diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index acc68cffaa98..6206323a89f5 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -1126,14 +1126,19 @@ public class Am extends BaseCommand { } } + private byte[] argToBytes(String arg) { + if (arg.equals("!")) { + return null; + } else { + return HexDump.hexStringToByteArray(arg); + } + } + private void runUnlockUser() throws Exception { int userId = Integer.parseInt(nextArgRequired()); - String tokenHex = nextArg(); - byte[] token = null; - if (tokenHex != null) { - token = HexDump.hexStringToByteArray(tokenHex); - } - boolean success = mAm.unlockUser(userId, token); + byte[] token = argToBytes(nextArgRequired()); + byte[] secret = argToBytes(nextArgRequired()); + boolean success = mAm.unlockUser(userId, token, secret); if (success) { System.out.println("Success: user unlocked"); } else { diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index c96cca27be55..4bc6b97c834d 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -624,8 +624,7 @@ public abstract class AccessibilityService extends Service { gesture, 100); try { synchronized (mLock) { - connection.sendMotionEvents(++mGestureStatusCallbackSequence, - new ParceledListSlice<>(events)); + mGestureStatusCallbackSequence++; if (callback != null) { if (mGestureStatusCallbackInfos == null) { mGestureStatusCallbackInfos = new SparseArray<>(); @@ -634,6 +633,8 @@ public abstract class AccessibilityService extends Service { callback, handler); mGestureStatusCallbackInfos.put(mGestureStatusCallbackSequence, callbackInfo); } + connection.sendMotionEvents(mGestureStatusCallbackSequence, + new ParceledListSlice<>(events)); } } catch (RemoteException re) { throw new RuntimeException(re); diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index a3160f4e113c..1954774e1177 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2080,7 +2080,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM data.enforceInterface(IActivityManager.descriptor); int userId = data.readInt(); byte[] token = data.createByteArray(); - boolean result = unlockUser(userId, token); + byte[] secret = data.createByteArray(); + boolean result = unlockUser(userId, token, secret); reply.writeNoException(); reply.writeInt(result ? 1 : 0); return true; @@ -5571,12 +5572,13 @@ class ActivityManagerProxy implements IActivityManager return result; } - public boolean unlockUser(int userId, byte[] token) throws RemoteException { + public boolean unlockUser(int userId, byte[] token, byte[] secret) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeInt(userId); data.writeByteArray(token); + data.writeByteArray(secret); mRemote.transact(IActivityManager.UNLOCK_USER_TRANSACTION, data, reply, 0); reply.readException(); boolean result = reply.readInt() != 0; diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index f5e7d78a655e..b5ca6ee5a343 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -426,7 +426,7 @@ public interface IActivityManager extends IInterface { // Multi-user APIs public boolean switchUser(int userid) throws RemoteException; public boolean startUserInBackground(int userid) throws RemoteException; - public boolean unlockUser(int userid, byte[] token) throws RemoteException; + public boolean unlockUser(int userid, byte[] token, byte[] secret) throws RemoteException; public int stopUser(int userid, boolean force, IStopUserCallback callback) throws RemoteException; public UserInfo getCurrentUser() throws RemoteException; public boolean isUserRunning(int userid, int flags) throws RemoteException; diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 9a88f2c67697..33fd1dbda63d 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -1842,13 +1842,10 @@ public class Instrumentation { * @see UiAutomation */ public UiAutomation getUiAutomation() { - if (mUiAutomationConnection != null) { - if (mUiAutomation == null) { - return getUiAutomation(0); - } - return mUiAutomation; + if ((mUiAutomation == null) || (mUiAutomation.isDestroyed())) { + return getUiAutomation(0); } - return null; + return mUiAutomation; } /** diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 1fea66522c7e..c79dae5dd913 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -181,7 +181,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7; /** - * Value for {@link #flags}: this is set of the application has specified + * Value for {@link #flags}: this is set if the application has specified * {@link android.R.styleable#AndroidManifestApplication_testOnly * android:testOnly} to be true. */ diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index aac004374c9f..08deedb9fb65 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4489,7 +4489,7 @@ public abstract class PackageManager { PackageParser.Package pkg = parser.parseMonolithicPackage(apkFile, 0); if ((flags & GET_SIGNATURES) != 0) { - parser.collectCertificates(pkg, 0); + PackageParser.collectCertificates(pkg, 0); } PackageUserState state = new PackageUserState(); return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state); diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 3802db85c1c0..72ace1583b4a 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -118,6 +118,8 @@ public class PackageParser { private static final boolean DEBUG_PARSER = false; private static final boolean DEBUG_BACKUP = false; + private static final int MAX_PACKAGES_PER_APK = 5; + // TODO: switch outError users to PackageParserException // TODO: refactor "codePath" to "apkPath" @@ -133,6 +135,50 @@ public class PackageParser { /** Path prefix for apps on expanded storage */ private static final String MNT_EXPAND = "/mnt/expand/"; + private static final String TAG_MANIFEST = "manifest"; + private static final String TAG_APPLICATION = "application"; + private static final String TAG_OVERLAY = "overlay"; + private static final String TAG_KEY_SETS = "key-sets"; + private static final String TAG_PERMISSION_GROUP = "permission-group"; + private static final String TAG_PERMISSION = "permission"; + private static final String TAG_PERMISSION_TREE = "permission-tree"; + private static final String TAG_USES_PERMISSION = "uses-permission"; + private static final String TAG_USES_PERMISSION_SDK_M = "uses-permission-sdk-m"; + private static final String TAG_USES_PERMISSION_SDK_23 = "uses-permission-sdk-23"; + private static final String TAG_USES_CONFIGURATION = "uses-configuration"; + private static final String TAG_USES_FEATURE = "uses-feature"; + private static final String TAG_FEATURE_GROUP = "feature-group"; + private static final String TAG_USES_SDK = "uses-sdk"; + private static final String TAG_SUPPORT_SCREENS = "supports-screens"; + private static final String TAG_PROTECTED_BROADCAST = "protected-broadcast"; + private static final String TAG_INSTRUMENTATION = "instrumentation"; + private static final String TAG_ORIGINAL_PACKAGE = "original-package"; + private static final String TAG_ADOPT_PERMISSIONS = "adopt-permissions"; + private static final String TAG_USES_GL_TEXTURE = "uses-gl-texture"; + private static final String TAG_COMPATIBLE_SCREENS = "compatible-screens"; + private static final String TAG_SUPPORTS_INPUT = "supports-input"; + private static final String TAG_EAT_COMMENT = "eat-comment"; + private static final String TAG_PACKAGE = "package"; + + // These are the tags supported by child packages + private static final Set<String> CHILD_PACKAGE_TAGS = new ArraySet<>(); + static { + CHILD_PACKAGE_TAGS.add(TAG_APPLICATION); + CHILD_PACKAGE_TAGS.add(TAG_USES_PERMISSION); + CHILD_PACKAGE_TAGS.add(TAG_USES_PERMISSION_SDK_M); + CHILD_PACKAGE_TAGS.add(TAG_USES_PERMISSION_SDK_23); + CHILD_PACKAGE_TAGS.add(TAG_USES_CONFIGURATION); + CHILD_PACKAGE_TAGS.add(TAG_USES_FEATURE); + CHILD_PACKAGE_TAGS.add(TAG_FEATURE_GROUP); + CHILD_PACKAGE_TAGS.add(TAG_USES_SDK); + CHILD_PACKAGE_TAGS.add(TAG_SUPPORT_SCREENS); + CHILD_PACKAGE_TAGS.add(TAG_INSTRUMENTATION); + CHILD_PACKAGE_TAGS.add(TAG_USES_GL_TEXTURE); + CHILD_PACKAGE_TAGS.add(TAG_COMPATIBLE_SCREENS); + CHILD_PACKAGE_TAGS.add(TAG_SUPPORTS_INPUT); + CHILD_PACKAGE_TAGS.add(TAG_EAT_COMMENT); + } + /** @hide */ public static class NewPermissionInfo { public final String name; @@ -796,8 +842,9 @@ public class PackageParser { } } - pkg.codePath = packageDir.getAbsolutePath(); - pkg.cpuAbiOverride = lite.abiOverride; + pkg.setCodePath(packageDir.getAbsolutePath()); + pkg.setCpuAbiOverride(lite.abiOverride); + return pkg; } finally { IoUtils.closeQuietly(assets); @@ -827,8 +874,8 @@ public class PackageParser { final AssetManager assets = new AssetManager(); try { final Package pkg = parseBaseApk(apkFile, assets, flags); - pkg.codePath = apkFile.getAbsolutePath(); - pkg.cpuAbiOverride = lite.abiOverride; + pkg.setCodePath(apkFile.getAbsolutePath()); + pkg.setCpuAbiOverride(lite.abiOverride); return pkg; } finally { IoUtils.closeQuietly(assets); @@ -885,10 +932,10 @@ public class PackageParser { apkPath + " (at " + parser.getPositionDescription() + "): " + outError[0]); } - pkg.volumeUuid = volumeUuid; - pkg.applicationInfo.volumeUuid = volumeUuid; - pkg.baseCodePath = apkPath; - pkg.mSignatures = null; + pkg.setVolumeUuid(volumeUuid); + pkg.setApplicationVolumeUuid(volumeUuid); + pkg.setBaseCodePath(apkPath); + pkg.setSignatures(null); return pkg; @@ -951,7 +998,7 @@ public class PackageParser { AttributeSet attrs = parser; // We parsed manifest tag earlier; just skip past it - parsePackageSplitNames(parser, attrs, flags); + parsePackageSplitNames(parser, attrs); mParseInstrumentationArgs = null; mParseActivityArgs = null; @@ -984,7 +1031,7 @@ public class PackageParser { } foundApp = true; - if (!parseSplitApplication(pkg, res, parser, attrs, flags, splitIndex, outError)) { + if (!parseSplitApplication(pkg, res, parser, flags, splitIndex, outError)) { return null; } @@ -1016,7 +1063,18 @@ public class PackageParser { * populating {@link Package#mSignatures}. Also asserts that all APK * contents are signed correctly and consistently. */ - public void collectCertificates(Package pkg, int parseFlags) throws PackageParserException { + public static void collectCertificates(Package pkg, int parseFlags) throws PackageParserException { + collectCertificatesInternal(pkg, parseFlags); + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + Package childPkg = pkg.childPackages.get(i); + childPkg.mCertificates = pkg.mCertificates; + childPkg.mSignatures = pkg.mSignatures; + childPkg.mSigningKeys = pkg.mSigningKeys; + } + } + + private static void collectCertificatesInternal(Package pkg, int parseFlags) throws PackageParserException { pkg.mCertificates = null; pkg.mSignatures = null; pkg.mSigningKeys = null; @@ -1269,7 +1327,7 @@ public class PackageParser { } private static Pair<String, String> parsePackageSplitNames(XmlPullParser parser, - AttributeSet attrs, int flags) throws IOException, XmlPullParserException, + AttributeSet attrs) throws IOException, XmlPullParserException, PackageParserException { int type; @@ -1281,7 +1339,7 @@ public class PackageParser { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "No start tag found"); } - if (!parser.getName().equals("manifest")) { + if (!parser.getName().equals(TAG_MANIFEST)) { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "No <manifest> tag"); } @@ -1315,7 +1373,7 @@ public class PackageParser { private static ApkLite parseApkLite(String codePath, Resources res, XmlPullParser parser, AttributeSet attrs, int flags, Signature[] signatures) throws IOException, XmlPullParserException, PackageParserException { - final Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs, flags); + final Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs); int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; int versionCode = 0; @@ -1391,46 +1449,120 @@ public class PackageParser { } /** - * Parse the manifest of a <em>base APK</em>. - * <p> - * When adding new features, carefully consider if they should also be - * supported by split APKs. + * Parses a child package and adds it to the parent if successful. If you add + * new tags that need to be supported by child packages make sure to add them + * to {@link #CHILD_PACKAGE_TAGS}. + * + * @param parentPkg The parent that contains the child + * @param res Resources against which to resolve values + * @param parser Parser of the manifest + * @param flags Flags about how to parse + * @param outError Human readable error if parsing fails + * @return True of parsing succeeded. + * + * @throws XmlPullParserException + * @throws IOException */ - private Package parseBaseApk(Resources res, XmlResourceParser parser, int flags, - String[] outError) throws XmlPullParserException, IOException { - final boolean trustedOverlay = (flags & PARSE_TRUSTED_OVERLAY) != 0; + private boolean parseBaseApkChild(Package parentPkg, Resources res, XmlResourceParser parser, + int flags, String[] outError) throws XmlPullParserException, IOException { + // Let ppl not abuse this mechanism by limiting the packages per APK + if (parentPkg.childPackages != null && parentPkg.childPackages.size() + 2 + > MAX_PACKAGES_PER_APK) { + outError[0] = "Maximum number of packages per APK is: " + MAX_PACKAGES_PER_APK; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + return false; + } - AttributeSet attrs = parser; + // Make sure we have a valid child package name + String childPackageName = parser.getAttributeValue(null, "package"); + if (validateName(childPackageName, true, false) != null) { + mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; + return false; + } - mParseInstrumentationArgs = null; - mParseActivityArgs = null; - mParseServiceArgs = null; - mParseProviderArgs = null; + // Child packages must be unique + if (childPackageName.equals(parentPkg.packageName)) { + String message = "Child package name cannot be equal to parent package name: " + + parentPkg.packageName; + Slog.w(TAG, message); + outError[0] = message; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + return false; + } - final String pkgName; + // Child packages must be unique + if (parentPkg.hasChildPackage(childPackageName)) { + String message = "Duplicate child package:" + childPackageName; + Slog.w(TAG, message); + outError[0] = message; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + return false; + } + + // Go ahead and parse the child + Package childPkg = new Package(childPackageName); + + // Child package inherits parent version code/name/target SDK + childPkg.mVersionCode = parentPkg.mVersionCode; + childPkg.baseRevisionCode = parentPkg.baseRevisionCode; + childPkg.mVersionName = parentPkg.mVersionName; + childPkg.applicationInfo.targetSdkVersion = parentPkg.applicationInfo.targetSdkVersion; + + childPkg = parseBaseApkCommon(childPkg, CHILD_PACKAGE_TAGS, res, parser, flags, outError); + if (childPkg == null) { + // If we got null then error was set during child parsing + return false; + } + + // Set the parent-child relation + if (parentPkg.childPackages == null) { + parentPkg.childPackages = new ArrayList<>(); + } + parentPkg.childPackages.add(childPkg); + childPkg.parentPackage = parentPkg; + + return true; + } + + /** + * Parse the manifest of a <em>base APK</em>. When adding new features you + * need to consider whether they should be supported by split APKs and child + * packages. + * + * @param res The resources from which to resolve values + * @param parser The manifest parser + * @param flags Flags how to parse + * @param outError Human readable error message + * @return Parsed package or null on error. + * + * @throws XmlPullParserException + * @throws IOException + */ + private Package parseBaseApk(Resources res, XmlResourceParser parser, int flags, + String[] outError) throws XmlPullParserException, IOException { final String splitName; + final String pkgName; + try { - Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs, flags); + Pair<String, String> packageSplit = parsePackageSplitNames(parser, parser); pkgName = packageSplit.first; splitName = packageSplit.second; - } catch (PackageParserException e) { - mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; - return null; - } - int type; - - if (!TextUtils.isEmpty(splitName)) { - outError[0] = "Expected base APK, but found split " + splitName; + if (!TextUtils.isEmpty(splitName)) { + outError[0] = "Expected base APK, but found split " + splitName; + mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; + return null; + } + } catch (PackageParserException e) { mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; return null; } final Package pkg = new Package(pkgName); - boolean foundApp = false; - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifest); + pkg.mVersionCode = pkg.applicationInfo.versionCode = sa.getInteger( com.android.internal.R.styleable.AndroidManifest_versionCode, 0); pkg.baseRevisionCode = sa.getInteger( @@ -1440,11 +1572,53 @@ public class PackageParser { if (pkg.mVersionName != null) { pkg.mVersionName = pkg.mVersionName.intern(); } + + pkg.coreApp = parser.getAttributeBooleanValue(null, "coreApp", false); + + sa.recycle(); + + return parseBaseApkCommon(pkg, null, res, parser, flags, outError); + } + + /** + * This is the common parsing routing for handling parent and child + * packages in a base APK. The difference between parent and child + * parsing is that some targs are not supported by child packages as + * well as some manifest attributes are ignored. The implementation + * assumes the calling code already handled the manifest tag if needed + * (this applies to the parent only). + * + * @param pkg The package which to populate + * @param acceptedTags Which tags to handle, null to handle all + * @param res Resources against which to resolve values + * @param parser Parser of the manifest + * @param flags Flags about how to parse + * @param outError Human readable error if parsing fails + * @return The package if parsing succeeded or null. + * + * @throws XmlPullParserException + * @throws IOException + */ + private Package parseBaseApkCommon(Package pkg, Set<String> acceptedTags, Resources res, + XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, + IOException { + final boolean trustedOverlay = (flags & PARSE_TRUSTED_OVERLAY) != 0; + mParseInstrumentationArgs = null; + mParseActivityArgs = null; + mParseServiceArgs = null; + mParseProviderArgs = null; + + int type; + boolean foundApp = false; + + TypedArray sa = res.obtainAttributes(parser, + com.android.internal.R.styleable.AndroidManifest); + String str = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); if (str != null && str.length() > 0) { String nameError = validateName(str, true, false); - if (nameError != null && !"android".equals(pkgName)) { + if (nameError != null && !"android".equals(pkg.packageName)) { outError[0] = "<manifest> specifies bad sharedUserId name \"" + str + "\": " + nameError; mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; @@ -1460,9 +1634,6 @@ public class PackageParser { PARSE_DEFAULT_INSTALL_LOCATION); pkg.applicationInfo.installLocation = pkg.installLocation; - pkg.coreApp = attrs.getAttributeBooleanValue(null, "coreApp", false); - - sa.recycle(); /* Set the global "forward lock" flag */ if ((flags & PARSE_FORWARD_LOCK) != 0) { @@ -1494,7 +1665,16 @@ public class PackageParser { } String tagName = parser.getName(); - if (tagName.equals("application")) { + + if (acceptedTags != null && !acceptedTags.contains(tagName)) { + Slog.w(TAG, "Skipping unsupported element under <manifest>: " + + tagName + " at " + mArchiveSourcePath + " " + + parser.getPositionDescription()); + XmlUtils.skipCurrentTag(parser); + continue; + } + + if (tagName.equals(TAG_APPLICATION)) { if (foundApp) { if (RIGID_PARSER) { outError[0] = "<manifest> has more than one <application>"; @@ -1508,13 +1688,13 @@ public class PackageParser { } foundApp = true; - if (!parseBaseApplication(pkg, res, parser, attrs, flags, outError)) { + if (!parseBaseApplication(pkg, res, parser, flags, outError)) { return null; } - } else if (tagName.equals("overlay")) { + } else if (tagName.equals(TAG_OVERLAY)) { pkg.mTrustedOverlay = trustedOverlay; - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestResourceOverlay); pkg.mOverlayTarget = sa.getString( com.android.internal.R.styleable.AndroidManifestResourceOverlay_targetPackage); @@ -1536,34 +1716,34 @@ public class PackageParser { } XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("key-sets")) { - if (!parseKeySets(pkg, res, parser, attrs, outError)) { + } else if (tagName.equals(TAG_KEY_SETS)) { + if (!parseKeySets(pkg, res, parser, outError)) { return null; } - } else if (tagName.equals("permission-group")) { - if (parsePermissionGroup(pkg, flags, res, parser, attrs, outError) == null) { + } else if (tagName.equals(TAG_PERMISSION_GROUP)) { + if (parsePermissionGroup(pkg, flags, res, parser, outError) == null) { return null; } - } else if (tagName.equals("permission")) { - if (parsePermission(pkg, res, parser, attrs, outError) == null) { + } else if (tagName.equals(TAG_PERMISSION)) { + if (parsePermission(pkg, res, parser, outError) == null) { return null; } - } else if (tagName.equals("permission-tree")) { - if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { + } else if (tagName.equals(TAG_PERMISSION_TREE)) { + if (parsePermissionTree(pkg, res, parser, outError) == null) { return null; } - } else if (tagName.equals("uses-permission")) { - if (!parseUsesPermission(pkg, res, parser, attrs)) { + } else if (tagName.equals(TAG_USES_PERMISSION)) { + if (!parseUsesPermission(pkg, res, parser)) { return null; } - } else if (tagName.equals("uses-permission-sdk-m") - || tagName.equals("uses-permission-sdk-23")) { - if (!parseUsesPermission(pkg, res, parser, attrs)) { + } else if (tagName.equals(TAG_USES_PERMISSION_SDK_M) + || tagName.equals(TAG_USES_PERMISSION_SDK_23)) { + if (!parseUsesPermission(pkg, res, parser)) { return null; } - } else if (tagName.equals("uses-configuration")) { + } else if (tagName.equals(TAG_USES_CONFIGURATION)) { ConfigurationInfo cPref = new ConfigurationInfo(); - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesConfiguration); cPref.reqTouchScreen = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, @@ -1589,8 +1769,8 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("uses-feature")) { - FeatureInfo fi = parseUsesFeature(res, attrs); + } else if (tagName.equals(TAG_USES_FEATURE)) { + FeatureInfo fi = parseUsesFeature(res, parser); pkg.reqFeatures = ArrayUtils.add(pkg.reqFeatures, fi); if (fi.name == null) { @@ -1601,7 +1781,7 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("feature-group")) { + } else if (tagName.equals(TAG_FEATURE_GROUP)) { FeatureGroupInfo group = new FeatureGroupInfo(); ArrayList<FeatureInfo> features = null; final int innerDepth = parser.getDepth(); @@ -1613,7 +1793,7 @@ public class PackageParser { final String innerTagName = parser.getName(); if (innerTagName.equals("uses-feature")) { - FeatureInfo featureInfo = parseUsesFeature(res, attrs); + FeatureInfo featureInfo = parseUsesFeature(res, parser); // FeatureGroups are stricter and mandate that // any <uses-feature> declared are mandatory. featureInfo.flags |= FeatureInfo.FLAG_REQUIRED; @@ -1632,9 +1812,9 @@ public class PackageParser { } pkg.featureGroups = ArrayUtils.add(pkg.featureGroups, group); - } else if (tagName.equals("uses-sdk")) { + } else if (tagName.equals(TAG_USES_SDK)) { if (SDK_VERSION > 0) { - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesSdk); int minVers = 0; @@ -1723,8 +1903,8 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("supports-screens")) { - sa = res.obtainAttributes(attrs, + } else if (tagName.equals(TAG_SUPPORT_SCREENS)) { + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestSupportsScreens); pkg.applicationInfo.requiresSmallestWidthDp = sa.getInteger( @@ -1762,8 +1942,8 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("protected-broadcast")) { - sa = res.obtainAttributes(attrs, + } else if (tagName.equals(TAG_PROTECTED_BROADCAST)) { + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestProtectedBroadcast); // Note: don't allow this value to be a reference to a resource @@ -1784,13 +1964,12 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("instrumentation")) { - if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { + } else if (tagName.equals(TAG_INSTRUMENTATION)) { + if (parseInstrumentation(pkg, res, parser, outError) == null) { return null; } - - } else if (tagName.equals("original-package")) { - sa = res.obtainAttributes(attrs, + } else if (tagName.equals(TAG_ORIGINAL_PACKAGE)) { + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestOriginalPackage); String orig =sa.getNonConfigurationString( @@ -1807,8 +1986,8 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("adopt-permissions")) { - sa = res.obtainAttributes(attrs, + } else if (tagName.equals(TAG_ADOPT_PERMISSIONS)) { + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestOriginalPackage); String name = sa.getNonConfigurationString( @@ -1825,24 +2004,29 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("uses-gl-texture")) { + } else if (tagName.equals(TAG_USES_GL_TEXTURE)) { // Just skip this tag XmlUtils.skipCurrentTag(parser); continue; - } else if (tagName.equals("compatible-screens")) { + } else if (tagName.equals(TAG_COMPATIBLE_SCREENS)) { // Just skip this tag XmlUtils.skipCurrentTag(parser); continue; - } else if (tagName.equals("supports-input")) { + } else if (tagName.equals(TAG_SUPPORTS_INPUT)) {// XmlUtils.skipCurrentTag(parser); continue; - } else if (tagName.equals("eat-comment")) { + } else if (tagName.equals(TAG_EAT_COMMENT)) { // Just skip this tag XmlUtils.skipCurrentTag(parser); continue; + } else if (tagName.equals(TAG_PACKAGE)) { + if (!parseBaseApkChild(pkg, res, parser, flags, outError)) { + // If parsing a child failed the error is already set + return null; + } } else if (RIGID_PARSER) { outError[0] = "Bad element under <manifest>: " + parser.getName(); @@ -1956,9 +2140,9 @@ public class PackageParser { return fi; } - private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser, - AttributeSet attrs) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser) + throws XmlPullParserException, IOException { + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesPermission); // Note: don't allow this value to be a reference to a resource @@ -2078,7 +2262,7 @@ public class PackageParser { } private boolean parseKeySets(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, String[] outError) + XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { // we've encountered the 'key-sets' tag // all the keys and keysets that we want must be defined here @@ -2108,7 +2292,7 @@ public class PackageParser { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } - final TypedArray sa = res.obtainAttributes(attrs, + final TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestKeySet); final String keysetName = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestKeySet_name); @@ -2123,7 +2307,7 @@ public class PackageParser { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } - final TypedArray sa = res.obtainAttributes(attrs, + final TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPublicKey); final String publicKeyName = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestPublicKey_name); @@ -2164,7 +2348,7 @@ public class PackageParser { sa.recycle(); XmlUtils.skipCurrentTag(parser); } else if (tagName.equals("upgrade-key-set")) { - final TypedArray sa = res.obtainAttributes(attrs, + final TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUpgradeKeySet); String name = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestUpgradeKeySet_name); @@ -2223,11 +2407,11 @@ public class PackageParser { } private PermissionGroup parsePermissionGroup(Package owner, int flags, Resources res, - XmlPullParser parser, AttributeSet attrs, String[] outError) - throws XmlPullParserException, IOException { + XmlResourceParser parser, String[] outError) + throws XmlPullParserException, IOException { PermissionGroup perm = new PermissionGroup(owner); - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPermissionGroup); if (!parsePackageItemInfo(owner, perm.info, outError, @@ -2255,7 +2439,7 @@ public class PackageParser { sa.recycle(); - if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, + if (!parseAllMetaData(res, parser, "<permission-group>", perm, outError)) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return null; @@ -2267,11 +2451,11 @@ public class PackageParser { } private Permission parsePermission(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, String[] outError) + XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { Permission perm = new Permission(owner); - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPermission); if (!parsePackageItemInfo(owner, perm.info, outError, @@ -2325,8 +2509,7 @@ public class PackageParser { } } - if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, - outError)) { + if (!parseAllMetaData(res, parser, "<permission>", perm, outError)) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return null; } @@ -2337,11 +2520,11 @@ public class PackageParser { } private Permission parsePermissionTree(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, String[] outError) + XmlResourceParser parser, String[] outError) throws XmlPullParserException, IOException { Permission perm = new Permission(owner); - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPermissionTree); if (!parsePackageItemInfo(owner, perm.info, outError, @@ -2373,7 +2556,7 @@ public class PackageParser { perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; perm.tree = true; - if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, + if (!parseAllMetaData(res, parser, "<permission-tree>", perm, outError)) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return null; @@ -2385,9 +2568,9 @@ public class PackageParser { } private Instrumentation parseInstrumentation(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, String[] outError) - throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + XmlResourceParser parser, String[] outError) + throws XmlPullParserException, IOException { + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestInstrumentation); if (mParseInstrumentationArgs == null) { @@ -2433,7 +2616,7 @@ public class PackageParser { return null; } - if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, + if (!parseAllMetaData(res, parser, "<instrumentation>", a, outError)) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return null; @@ -2452,12 +2635,12 @@ public class PackageParser { * supported by split APKs. */ private boolean parseBaseApplication(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) + XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, IOException { final ApplicationInfo ai = owner.applicationInfo; final String pkgName = owner.applicationInfo.packageName; - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestApplication); String name = sa.getNonConfigurationString( @@ -2608,10 +2791,13 @@ public class PackageParser { ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; } - if (sa.getBoolean( - com.android.internal.R.styleable.AndroidManifestApplication_testOnly, - false)) { - ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; + // The parent package controls installation, hence specify test only installs. + if (owner.parentPackage == null) { + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_testOnly, + false)) { + ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; + } } if (sa.getBoolean( @@ -2736,7 +2922,7 @@ public class PackageParser { String tagName = parser.getName(); if (tagName.equals("activity")) { - Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false, + Activity a = parseActivity(owner, res, parser, flags, outError, false, owner.baseHardwareAccelerated); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; @@ -2746,7 +2932,7 @@ public class PackageParser { owner.activities.add(a); } else if (tagName.equals("receiver")) { - Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false); + Activity a = parseActivity(owner, res, parser, flags, outError, true, false); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2755,7 +2941,7 @@ public class PackageParser { owner.receivers.add(a); } else if (tagName.equals("service")) { - Service s = parseService(owner, res, parser, attrs, flags, outError); + Service s = parseService(owner, res, parser, flags, outError); if (s == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2764,7 +2950,7 @@ public class PackageParser { owner.services.add(s); } else if (tagName.equals("provider")) { - Provider p = parseProvider(owner, res, parser, attrs, flags, outError); + Provider p = parseProvider(owner, res, parser, flags, outError); if (p == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2773,7 +2959,7 @@ public class PackageParser { owner.providers.add(p); } else if (tagName.equals("activity-alias")) { - Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); + Activity a = parseActivityAlias(owner, res, parser, flags, outError); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2785,14 +2971,14 @@ public class PackageParser { // note: application meta-data is stored off to the side, so it can // remain null in the primary copy (we like to avoid extra copies because // it can be large) - if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, + if ((owner.mAppMetaData = parseMetaData(res, parser, owner.mAppMetaData, outError)) == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } } else if (tagName.equals("library")) { - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestLibrary); // Note: don't allow this value to be a reference to a resource @@ -2812,7 +2998,7 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); } else if (tagName.equals("uses-library")) { - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesLibrary); // Note: don't allow this value to be a reference to a resource @@ -2913,10 +3099,10 @@ public class PackageParser { * of doing, so many valid features of a base APK have been carefully * omitted here. */ - private boolean parseSplitApplication(Package owner, Resources res, XmlPullParser parser, - AttributeSet attrs, int flags, int splitIndex, String[] outError) + private boolean parseSplitApplication(Package owner, Resources res, XmlResourceParser parser, + int flags, int splitIndex, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestApplication); if (sa.getBoolean( @@ -2934,7 +3120,7 @@ public class PackageParser { String tagName = parser.getName(); if (tagName.equals("activity")) { - Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false, + Activity a = parseActivity(owner, res, parser, flags, outError, false, owner.baseHardwareAccelerated); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; @@ -2944,7 +3130,7 @@ public class PackageParser { owner.activities.add(a); } else if (tagName.equals("receiver")) { - Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false); + Activity a = parseActivity(owner, res, parser, flags, outError, true, false); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2953,7 +3139,7 @@ public class PackageParser { owner.receivers.add(a); } else if (tagName.equals("service")) { - Service s = parseService(owner, res, parser, attrs, flags, outError); + Service s = parseService(owner, res, parser, flags, outError); if (s == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2962,7 +3148,7 @@ public class PackageParser { owner.services.add(s); } else if (tagName.equals("provider")) { - Provider p = parseProvider(owner, res, parser, attrs, flags, outError); + Provider p = parseProvider(owner, res, parser, flags, outError); if (p == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2971,7 +3157,7 @@ public class PackageParser { owner.providers.add(p); } else if (tagName.equals("activity-alias")) { - Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); + Activity a = parseActivityAlias(owner, res, parser, flags, outError); if (a == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; @@ -2983,14 +3169,14 @@ public class PackageParser { // note: application meta-data is stored off to the side, so it can // remain null in the primary copy (we like to avoid extra copies because // it can be large) - if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, + if ((owner.mAppMetaData = parseMetaData(res, parser, owner.mAppMetaData, outError)) == null) { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } } else if (tagName.equals("uses-library")) { - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestUsesLibrary); // Note: don't allow this value to be a reference to a resource @@ -3086,10 +3272,10 @@ public class PackageParser { } private Activity parseActivity(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, + XmlResourceParser parser, int flags, String[] outError, boolean receiver, boolean hardwareAccelerated) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, R.styleable.AndroidManifestActivity); + TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestActivity); if (mParseActivityArgs == null) { mParseActivityArgs = new ParseComponentArgs(owner, outError, @@ -3327,7 +3513,7 @@ public class PackageParser { if (parser.getName().equals("intent-filter")) { ActivityIntentInfo intent = new ActivityIntentInfo(a); - if (!parseIntent(res, parser, attrs, true, true, intent, outError)) { + if (!parseIntent(res, parser, true, true, intent, outError)) { return null; } if (intent.countActions() == 0) { @@ -3339,7 +3525,7 @@ public class PackageParser { } } else if (!receiver && parser.getName().equals("preferred")) { ActivityIntentInfo intent = new ActivityIntentInfo(a); - if (!parseIntent(res, parser, attrs, false, false, intent, outError)) { + if (!parseIntent(res, parser, false, false, intent, outError)) { return null; } if (intent.countActions() == 0) { @@ -3353,12 +3539,12 @@ public class PackageParser { owner.preferredActivityFilters.add(intent); } } else if (parser.getName().equals("meta-data")) { - if ((a.metaData = parseMetaData(res, parser, attrs, a.metaData, + if ((a.metaData = parseMetaData(res, parser, a.metaData, outError)) == null) { return null; } } else if (!receiver && parser.getName().equals("layout")) { - parseLayout(res, attrs, a); + parseLayout(res, parser, a); } else { if (!RIGID_PARSER) { Slog.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); @@ -3432,9 +3618,9 @@ public class PackageParser { } private Activity parseActivityAlias(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) + XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestActivityAlias); String targetActivity = sa.getNonConfigurationString( @@ -3565,7 +3751,7 @@ public class PackageParser { if (parser.getName().equals("intent-filter")) { ActivityIntentInfo intent = new ActivityIntentInfo(a); - if (!parseIntent(res, parser, attrs, true, true, intent, outError)) { + if (!parseIntent(res, parser, true, true, intent, outError)) { return null; } if (intent.countActions() == 0) { @@ -3576,7 +3762,7 @@ public class PackageParser { a.intents.add(intent); } } else if (parser.getName().equals("meta-data")) { - if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, + if ((a.metaData=parseMetaData(res, parser, a.metaData, outError)) == null) { return null; } @@ -3602,9 +3788,9 @@ public class PackageParser { } private Provider parseProvider(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) + XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestProvider); if (mParseProviderArgs == null) { @@ -3731,7 +3917,7 @@ public class PackageParser { } p.info.authority = cpname.intern(); - if (!parseProviderTags(res, parser, attrs, p, outError)) { + if (!parseProviderTags(res, parser, p, outError)) { return null; } @@ -3739,8 +3925,7 @@ public class PackageParser { } private boolean parseProviderTags(Resources res, - XmlPullParser parser, AttributeSet attrs, - Provider outInfo, String[] outError) + XmlResourceParser parser, Provider outInfo, String[] outError) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); int type; @@ -3753,19 +3938,19 @@ public class PackageParser { if (parser.getName().equals("intent-filter")) { ProviderIntentInfo intent = new ProviderIntentInfo(outInfo); - if (!parseIntent(res, parser, attrs, true, false, intent, outError)) { + if (!parseIntent(res, parser, true, false, intent, outError)) { return false; } outInfo.intents.add(intent); } else if (parser.getName().equals("meta-data")) { - if ((outInfo.metaData=parseMetaData(res, parser, attrs, + if ((outInfo.metaData=parseMetaData(res, parser, outInfo.metaData, outError)) == null) { return false; } } else if (parser.getName().equals("grant-uri-permission")) { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestGrantUriPermission); PatternMatcher pa = null; @@ -3817,7 +4002,7 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); } else if (parser.getName().equals("path-permission")) { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestPathPermission); PathPermission pa = null; @@ -3922,9 +4107,9 @@ public class PackageParser { } private Service parseService(Package owner, Resources res, - XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) + XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestService); if (mParseServiceArgs == null) { @@ -4025,13 +4210,13 @@ public class PackageParser { if (parser.getName().equals("intent-filter")) { ServiceIntentInfo intent = new ServiceIntentInfo(s); - if (!parseIntent(res, parser, attrs, true, false, intent, outError)) { + if (!parseIntent(res, parser, true, false, intent, outError)) { return null; } s.intents.add(intent); } else if (parser.getName().equals("meta-data")) { - if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, + if ((s.metaData=parseMetaData(res, parser, s.metaData, outError)) == null) { return null; } @@ -4056,10 +4241,8 @@ public class PackageParser { return s; } - private boolean parseAllMetaData(Resources res, - XmlPullParser parser, AttributeSet attrs, String tag, - Component<?> outInfo, String[] outError) - throws XmlPullParserException, IOException { + private boolean parseAllMetaData(Resources res, XmlResourceParser parser, String tag, + Component<?> outInfo, String[] outError) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); int type; while ((type=parser.next()) != XmlPullParser.END_DOCUMENT @@ -4070,7 +4253,7 @@ public class PackageParser { } if (parser.getName().equals("meta-data")) { - if ((outInfo.metaData=parseMetaData(res, parser, attrs, + if ((outInfo.metaData=parseMetaData(res, parser, outInfo.metaData, outError)) == null) { return false; } @@ -4091,11 +4274,10 @@ public class PackageParser { } private Bundle parseMetaData(Resources res, - XmlPullParser parser, AttributeSet attrs, - Bundle data, String[] outError) + XmlResourceParser parser, Bundle data, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestMetaData); if (data == null) { @@ -4234,11 +4416,11 @@ public class PackageParser { private static final String ANDROID_RESOURCES = "http://schemas.android.com/apk/res/android"; - private boolean parseIntent(Resources res, XmlPullParser parser, AttributeSet attrs, + private boolean parseIntent(Resources res, XmlResourceParser parser, boolean allowGlobs, boolean allowAutoVerify, IntentInfo outInfo, String[] outError) throws XmlPullParserException, IOException { - TypedArray sa = res.obtainAttributes(attrs, + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestIntentFilter); int priority = sa.getInt( @@ -4278,7 +4460,7 @@ public class PackageParser { String nodeName = parser.getName(); if (nodeName.equals("action")) { - String value = attrs.getAttributeValue( + String value = parser.getAttributeValue( ANDROID_RESOURCES, "name"); if (value == null || value == "") { outError[0] = "No value supplied for <android:name>"; @@ -4288,7 +4470,7 @@ public class PackageParser { outInfo.addAction(value); } else if (nodeName.equals("category")) { - String value = attrs.getAttributeValue( + String value = parser.getAttributeValue( ANDROID_RESOURCES, "name"); if (value == null || value == "") { outError[0] = "No value supplied for <android:name>"; @@ -4299,7 +4481,7 @@ public class PackageParser { outInfo.addCategory(value); } else if (nodeName.equals("data")) { - sa = res.obtainAttributes(attrs, + sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifestData); String str = sa.getNonConfigurationString( @@ -4464,6 +4646,9 @@ public class PackageParser { public ArrayList<String> protectedBroadcasts; + public Package parentPackage; + public ArrayList<Package> childPackages; + public ArrayList<String> libraryNames = null; public ArrayList<String> usesLibraries = null; public ArrayList<String> usesOptionalLibraries = null; @@ -4562,6 +4747,141 @@ public class PackageParser { applicationInfo.uid = -1; } + public void setApplicationVolumeUuid(String volumeUuid) { + this.applicationInfo.volumeUuid = volumeUuid; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.volumeUuid = volumeUuid; + } + } + } + + public void setApplicationInfoCodePath(String codePath) { + this.applicationInfo.setCodePath(codePath); + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.setCodePath(codePath); + } + } + } + + public void setApplicationInfoResourcePath(String resourcePath) { + this.applicationInfo.setResourcePath(resourcePath); + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.setResourcePath(resourcePath); + } + } + } + + public void setApplicationInfoBaseResourcePath(String resourcePath) { + this.applicationInfo.setBaseResourcePath(resourcePath); + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.setBaseResourcePath(resourcePath); + } + } + } + + public void setApplicationInfoBaseCodePath(String baseCodePath) { + this.applicationInfo.setBaseCodePath(baseCodePath); + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.setBaseCodePath(baseCodePath); + } + } + } + + public boolean hasChildPackage(String packageName) { + final int childCount = (childPackages != null) ? childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + if (childPackages.get(i).packageName.equals(packageName)) { + return true; + } + } + return false; + } + + public void setApplicationInfoSplitCodePaths(String[] splitCodePaths) { + this.applicationInfo.setSplitCodePaths(splitCodePaths); + // Children have no splits + } + + public void setApplicationInfoSplitResourcePaths(String[] resroucePaths) { + this.applicationInfo.setSplitResourcePaths(resroucePaths); + // Children have no splits + } + + public void setSplitCodePaths(String[] codePaths) { + this.splitCodePaths = codePaths; + } + + public void setCodePath(String codePath) { + this.codePath = codePath; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).codePath = codePath; + } + } + } + + public void setBaseCodePath(String baseCodePath) { + this.baseCodePath = baseCodePath; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).baseCodePath = baseCodePath; + } + } + } + + public void setSignatures(Signature[] signatures) { + this.mSignatures = signatures; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).mSignatures = signatures; + } + } + } + + public void setVolumeUuid(String volumeUuid) { + this.volumeUuid = volumeUuid; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).volumeUuid = volumeUuid; + } + } + } + + public void setApplicationInfoFlags(int mask, int flags) { + applicationInfo.flags = (applicationInfo.flags & ~mask) | (mask & flags); + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).applicationInfo.flags = + (applicationInfo.flags & ~mask) | (mask & flags); + } + } + } + + public void setCpuAbiOverride(String cpuAbiOverride) { + this.cpuAbiOverride = cpuAbiOverride; + if (childPackages != null) { + final int packageCount = childPackages.size(); + for (int i = 0; i < packageCount; i++) { + childPackages.get(i).cpuAbiOverride = cpuAbiOverride; + } + } + } + public List<String> getAllCodePaths() { ArrayList<String> paths = new ArrayList<>(); paths.add(baseCodePath); diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java new file mode 100644 index 000000000000..80e61462873f --- /dev/null +++ b/core/java/android/os/UpdateEngine.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 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.os; + +import android.annotation.SystemApi; +import android.os.IUpdateEngine; +import android.os.IUpdateEngineCallback; +import android.os.RemoteException; + +import android.util.Log; + +/** + * UpdateEngine handles calls to the update engine which takes care of A/B OTA + * updates. It wraps up the update engine Binder APIs and exposes them as + * SystemApis, which will be called by system apps like GmsCore. + * + * The APIs defined in this class and UpdateEngineCallback class must be in + * sync with the ones in + * system/update_engine/binder_bindings/android/os/IUpdateEngine.aidl and + * system/update_engine/binder_bindings/android/os/IUpdateEngineCallback.aidl. + * + * {@hide} + */ +@SystemApi +public class UpdateEngine { + private static final String TAG = "UpdateEngine"; + + private static final String UPDATE_ENGINE_SERVICE = "android.os.UpdateEngineService"; + + /** + * Error code from the update engine. Values must agree with the ones in + * system/update_engine/common/error_code.h. + */ + @SystemApi + public static final class ErrorCodeConstants { + public static final int SUCCESS = 0; + public static final int ERROR = 1; + public static final int FILESYSTEM_COPIER_ERROR = 4; + public static final int POST_INSTALL_RUNNER_ERROR = 5; + public static final int PAYLOAD_MISMATCHED_TYPE_ERROR = 6; + public static final int INSTALL_DEVICE_OPEN_ERROR = 7; + public static final int KERNEL_DEVICE_OPEN_ERROR = 8; + public static final int DOWNLOAD_TRANSFER_ERROR = 9; + public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10; + public static final int PAYLOAD_SIZE_MISMATCH_ERROR = 11; + public static final int DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 12; + } + + /** + * Update status code from the update engine. Values must agree with the + * ones in system/update_engine/client_library/include/update_engine/update_status.h. + */ + @SystemApi + public static final class UpdateStatusConstants { + public static final int IDLE = 0; + public static final int CHECKING_FOR_UPDATE = 1; + public static final int UPDATE_AVAILABLE = 2; + public static final int DOWNLOADING = 3; + public static final int VERIFYING = 4; + public static final int FINALIZING = 5; + public static final int UPDATED_NEED_REBOOT = 6; + public static final int REPORTING_ERROR_EVENT = 7; + public static final int ATTEMPTING_ROLLBACK = 8; + public static final int DISABLED = 9; + } + + private IUpdateEngine mUpdateEngine; + + @SystemApi + public UpdateEngine() { + mUpdateEngine = IUpdateEngine.Stub.asInterface( + ServiceManager.getService(UPDATE_ENGINE_SERVICE)); + } + + @SystemApi + public boolean bind(final UpdateEngineCallback callback, final Handler handler) throws RemoteException { + IUpdateEngineCallback updateEngineCallback = new IUpdateEngineCallback.Stub() { + @Override + public void onStatusUpdate(final int status, final float percent) { + if (handler != null) { + handler.post(new Runnable() { + @Override + public void run() { + callback.onStatusUpdate(status, percent); + } + }); + } else { + callback.onStatusUpdate(status, percent); + } + } + + @Override + public void onPayloadApplicationComplete(final int errorCode) { + if (handler != null) { + handler.post(new Runnable() { + @Override + public void run() { + callback.onPayloadApplicationComplete(errorCode); + } + }); + } else { + callback.onPayloadApplicationComplete(errorCode); + } + } + }; + + return mUpdateEngine.bind(updateEngineCallback); + } + + @SystemApi + public boolean bind(final UpdateEngineCallback callback) throws RemoteException { + return bind(callback, null); + } + + @SystemApi + public void applyPayload(String url, long offset, long size, String[] headerKeyValuePairs) throws RemoteException { + mUpdateEngine.applyPayload(url, offset, size, headerKeyValuePairs); + } + + @SystemApi + public void cancel() throws RemoteException { + mUpdateEngine.cancel(); + } + + @SystemApi + public void suspend() throws RemoteException { + mUpdateEngine.suspend(); + } + + @SystemApi + public void resume() throws RemoteException { + mUpdateEngine.resume(); + } +} diff --git a/core/java/android/os/UpdateEngineCallback.java b/core/java/android/os/UpdateEngineCallback.java new file mode 100644 index 000000000000..b3b856fcf142 --- /dev/null +++ b/core/java/android/os/UpdateEngineCallback.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 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.os; + +import android.annotation.SystemApi; + +/** + * Callback function for UpdateEngine. + * + * The APIs defined in this class and UpdateEngine class must be in sync with + * the ones in + * system/update_engine/binder_bindings/android/os/IUpdateEngine.aidl and + * system/update_engine/binder_bindings/android/os/IUpdateEngineCallback.aidl. + * + * {@hide} + */ +@SystemApi +public abstract class UpdateEngineCallback { + + @SystemApi + public abstract void onStatusUpdate(int status, float percent); + + @SystemApi + public abstract void onPayloadApplicationComplete(int errorCode); +} diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index dd8eb5f2c634..fc440d2b446b 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -1233,7 +1233,8 @@ public interface IMountService extends IInterface { } @Override - public void unlockUserKey(int userId, int serialNumber, byte[] token) throws RemoteException { + public void changeUserKey(int userId, int serialNumber, + byte[] token, byte[] oldSecret, byte[] newSecret) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { @@ -1241,6 +1242,27 @@ public interface IMountService extends IInterface { _data.writeInt(userId); _data.writeInt(serialNumber); _data.writeByteArray(token); + _data.writeByteArray(oldSecret); + _data.writeByteArray(newSecret); + mRemote.transact(Stub.TRANSACTION_changeUserKey, _data, _reply, 0); + _reply.readException(); + } finally { + _reply.recycle(); + _data.recycle(); + } + } + + @Override + public void unlockUserKey(int userId, int serialNumber, + byte[] token, byte[] secret) throws RemoteException { + Parcel _data = Parcel.obtain(); + Parcel _reply = Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(userId); + _data.writeInt(serialNumber); + _data.writeByteArray(token); + _data.writeByteArray(secret); mRemote.transact(Stub.TRANSACTION_unlockUserKey, _data, _reply, 0); _reply.readException(); } finally { @@ -1448,6 +1470,8 @@ public interface IMountService extends IInterface { static final int TRANSACTION_mountAppFuse = IBinder.FIRST_CALL_TRANSACTION + 69; + static final int TRANSACTION_changeUserKey = IBinder.FIRST_CALL_TRANSACTION + 70; + /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. @@ -2026,12 +2050,24 @@ public interface IMountService extends IInterface { reply.writeNoException(); return true; } + case TRANSACTION_changeUserKey: { + data.enforceInterface(DESCRIPTOR); + int userId = data.readInt(); + int serialNumber = data.readInt(); + byte[] token = data.createByteArray(); + byte[] oldSecret = data.createByteArray(); + byte[] newSecret = data.createByteArray(); + changeUserKey(userId, serialNumber, token, oldSecret, newSecret); + reply.writeNoException(); + return true; + } case TRANSACTION_unlockUserKey: { data.enforceInterface(DESCRIPTOR); int userId = data.readInt(); int serialNumber = data.readInt(); byte[] token = data.createByteArray(); - unlockUserKey(userId, serialNumber, token); + byte[] secret = data.createByteArray(); + unlockUserKey(userId, serialNumber, token, secret); reply.writeNoException(); return true; } @@ -2383,8 +2419,11 @@ public interface IMountService extends IInterface { public void createUserKey(int userId, int serialNumber, boolean ephemeral) throws RemoteException; public void destroyUserKey(int userId) throws RemoteException; + public void changeUserKey(int userId, int serialNumber, + byte[] token, byte[] oldSecret, byte[] newSecret) throws RemoteException; - public void unlockUserKey(int userId, int serialNumber, byte[] token) throws RemoteException; + public void unlockUserKey(int userId, int serialNumber, + byte[] token, byte[] secret) throws RemoteException; public void lockUserKey(int userId) throws RemoteException; public boolean isUserKeyUnlocked(int userId) throws RemoteException; diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index b82638aa005b..e7dfbd72292a 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -991,9 +991,9 @@ public class StorageManager { } /** {@hide} */ - public void unlockUserKey(int userId, int serialNumber, byte[] token) { + public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) { try { - mMountService.unlockUserKey(userId, serialNumber, token); + mMountService.unlockUserKey(userId, serialNumber, token, secret); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/core/java/android/transition/Fade.java b/core/java/android/transition/Fade.java index 287c69608b8b..b2e8d3351028 100644 --- a/core/java/android/transition/Fade.java +++ b/core/java/android/transition/Fade.java @@ -57,9 +57,9 @@ import android.view.ViewGroup; * tag <code>fade</code>, along with the standard * attributes of {@link android.R.styleable#Fade} and * {@link android.R.styleable#Transition}.</p> - */ public class Fade extends Visibility { + static final String PROPNAME_TRANSITION_ALPHA = "android:fade:transitionAlpha"; private static boolean DBG = Transition.DBG && false; @@ -105,6 +105,13 @@ public class Fade extends Visibility { setMode(fadingMode); } + @Override + public void captureStartValues(TransitionValues transitionValues) { + super.captureStartValues(transitionValues); + transitionValues.values.put(PROPNAME_TRANSITION_ALPHA, + transitionValues.view.getTransitionAlpha()); + } + /** * Utility method to handle creating and running the Animator. */ @@ -119,7 +126,6 @@ public class Fade extends Visibility { } final FadeAnimatorListener listener = new FadeAnimatorListener(view); anim.addListener(listener); - anim.addPauseListener(listener); addListener(new TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { @@ -138,18 +144,28 @@ public class Fade extends Visibility { Log.d(LOG_TAG, "Fade.onAppear: startView, startVis, endView, endVis = " + startView + ", " + view); } - return createAnimation(view, 0, 1); + float startAlpha = 0; + if (startValues != null) { + startAlpha = (Float) startValues.values.get(PROPNAME_TRANSITION_ALPHA); + if (startAlpha == 1) { + startAlpha = 0; + } + } + return createAnimation(view, startAlpha, 1); } @Override public Animator onDisappear(ViewGroup sceneRoot, final View view, TransitionValues startValues, TransitionValues endValues) { - return createAnimation(view, 1, 0); + float startAlpha = 1; + if (startValues != null) { + startAlpha = (Float) startValues.values.get(PROPNAME_TRANSITION_ALPHA); + } + return createAnimation(view, startAlpha, 0); } private static class FadeAnimatorListener extends AnimatorListenerAdapter { private final View mView; - private float mPausedAlpha = -1; private boolean mLayerTypeChanged = false; public FadeAnimatorListener(View view) { @@ -171,16 +187,5 @@ public class Fade extends Visibility { mView.setLayerType(View.LAYER_TYPE_NONE, null); } } - - @Override - public void onAnimationPause(Animator animator) { - mPausedAlpha = mView.getTransitionAlpha(); - mView.setTransitionAlpha(1); - } - - @Override - public void onAnimationResume(Animator animator) { - mView.setTransitionAlpha(mPausedAlpha); - } } } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 1740f071c3fc..5b9930bb34a7 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -166,6 +166,7 @@ interface IWindowManager in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, int logo, int windowFlags, IBinder transferFrom, boolean createIfNeeded); void setAppVisibility(IBinder token, boolean visible); + void notifyAppStopped(IBinder token); void startAppFreezingScreen(IBinder token, int configChanges); void stopAppFreezingScreen(IBinder token, boolean force); void removeAppToken(IBinder token); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 127157b11a91..f52b29077f27 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -16582,11 +16582,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, RenderNode renderNode = null; Bitmap cache = null; int layerType = getLayerType(); // TODO: signify cache state with just 'cache' local - if (layerType == LAYER_TYPE_SOFTWARE - || (!drawingWithRenderNode && layerType != LAYER_TYPE_NONE)) { - // If not drawing with RenderNode, treat HW layers as SW - layerType = LAYER_TYPE_SOFTWARE; - buildDrawingCache(true); + if (layerType == LAYER_TYPE_SOFTWARE || !drawingWithRenderNode) { + if (layerType != LAYER_TYPE_NONE) { + // If not drawing with RenderNode, treat HW layers as SW + layerType = LAYER_TYPE_SOFTWARE; + buildDrawingCache(true); + } cache = getDrawingCache(true); } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 6e38b3268683..947906bf4403 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -460,6 +460,11 @@ public interface WindowManagerPolicy { /** Unregister a system listener for touch events */ void unregisterPointerEventListener(PointerEventListener listener); + + /** + * @return The content insets of the docked divider window. + */ + int getDockedDividerInsetsLw(); } public interface PointerEventListener { diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java index e31bbe9e6002..1d242d38ab58 100644 --- a/core/java/android/widget/EditText.java +++ b/core/java/android/widget/EditText.java @@ -65,6 +65,11 @@ public class EditText extends TextView { } @Override + public boolean getFreezesText() { + return true; + } + + @Override protected boolean getDefaultEditable() { return true; } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 3a61fcda163b..1826dd82abed 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1851,8 +1851,7 @@ public class Editor { updateCursorPosition(0, top, middle, layout.getPrimaryHorizontal(offset, clamped)); if (mCursorCount == 2) { - updateCursorPosition(1, middle, bottom, - layout.getSecondaryHorizontal(offset, clamped)); + updateCursorPosition(1, middle, bottom, layout.getSecondaryHorizontal(offset, clamped)); } } @@ -2151,18 +2150,57 @@ public class Editor { return mSelectionModifierCursorController; } + /** + * @hide + */ + @VisibleForTesting + public Drawable[] getCursorDrawable() { + return mCursorDrawable; + } + private void updateCursorPosition(int cursorIndex, int top, int bottom, float horizontal) { if (mCursorDrawable[cursorIndex] == null) mCursorDrawable[cursorIndex] = mTextView.getContext().getDrawable( mTextView.mCursorDrawableRes); + final Drawable drawable = mCursorDrawable[cursorIndex]; + final int left = clampCursorHorizontalPosition(drawable, horizontal); + final int width = drawable.getIntrinsicWidth(); + drawable.setBounds(left, top - mTempRect.top, left + width, + bottom + mTempRect.bottom); + } - if (mTempRect == null) mTempRect = new Rect(); - mCursorDrawable[cursorIndex].getPadding(mTempRect); - final int width = mCursorDrawable[cursorIndex].getIntrinsicWidth(); + /** + * Return clamped position for the cursor. If the cursor is within the boundaries of the view, + * then it is offset with the left padding of the cursor drawable. If the cursor is at + * the beginning or the end of the text then its drawable edge is aligned with left or right of + * the view boundary. + * + * @param drawable Cursor drawable. + * @param horizontal Horizontal position for the cursor. + * @return The clamped horizontal position for the cursor. + */ + private final int clampCursorHorizontalPosition(final Drawable drawable, float + horizontal) { horizontal = Math.max(0.5f, horizontal - 0.5f); - final int left = (int) (horizontal) - mTempRect.left; - mCursorDrawable[cursorIndex].setBounds(left, top - mTempRect.top, left + width, - bottom + mTempRect.bottom); + if (mTempRect == null) mTempRect = new Rect(); + drawable.getPadding(mTempRect); + int scrollX = mTextView.getScrollX(); + float horizontalDiff = horizontal - scrollX; + int viewClippedWidth = mTextView.getWidth() - mTextView.getCompoundPaddingLeft() + - mTextView.getCompoundPaddingRight(); + + final int left; + if (horizontalDiff >= (viewClippedWidth - 1f)) { + // at the rightmost position + final int cursorWidth = drawable.getIntrinsicWidth(); + left = viewClippedWidth + scrollX - (cursorWidth - mTempRect.right); + } else if (Math.abs(horizontalDiff) <= 1f) { + // at the leftmost position + left = scrollX - mTempRect.left; + } else { + left = (int) horizontal - mTempRect.left; + } + return left; } /** @@ -3919,8 +3957,8 @@ public class Editor { final Layout layout = mTextView.getLayout(); if (layout != null && oldDrawable != mDrawable && isShowing()) { // Update popup window position. - mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX - - getHorizontalOffset() + getCursorOffset()); + mPositionX = getCursorHorizontalPosition(layout, offset) - mHotspotX - + getHorizontalOffset() + getCursorOffset(); mPositionX += mTextView.viewportToContentHorizontalOffset(); mPositionHasChanged = true; updatePosition(mLastParentX, mLastParentY, false, false); @@ -4049,8 +4087,8 @@ public class Editor { final int line = layout.getLineForOffset(offset); mPrevLine = line; - mPositionX = (int) (layout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX - - getHorizontalOffset() + getCursorOffset()); + mPositionX = getCursorHorizontalPosition(layout, offset) - mHotspotX - + getHorizontalOffset() + getCursorOffset(); mPositionY = layout.getLineBottom(line); // Take TextView's padding and scroll into account. @@ -4062,6 +4100,17 @@ public class Editor { } } + /** + * Return the clamped horizontal position for the first cursor. + * + * @param layout Text layout. + * @param offset Character offset for the cursor. + * @return The clamped horizontal position for the cursor. + */ + int getCursorHorizontalPosition(Layout layout, int offset) { + return (int) (layout.getPrimaryHorizontal(offset) - 0.5f); + } + public void updatePosition(int parentPositionX, int parentPositionY, boolean parentPositionChanged, boolean parentScrolled) { positionAtCursorOffset(getCurrentCursorOffset(), parentScrolled); @@ -4300,6 +4349,16 @@ public class Editor { } @Override + int getCursorHorizontalPosition(Layout layout, int offset) { + final Drawable drawable = mCursorCount > 0 ? mCursorDrawable[0] : null; + if (drawable != null) { + final float horizontal = layout.getPrimaryHorizontal(offset); + return clampCursorHorizontalPosition(drawable, horizontal) + mTempRect.left; + } + return super.getCursorHorizontalPosition(layout, offset); + } + + @Override public boolean onTouchEvent(MotionEvent ev) { final boolean result = super.onTouchEvent(ev); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 712a04bf6fae..a5c1da936f99 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -4101,36 +4101,42 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Parcelable superState = super.onSaveInstanceState(); // Save state if we are forced to - boolean save = mFreezesText; - int start = 0; - int end = 0; + final boolean freezesText = getFreezesText(); + boolean hasSelection = false; + int start = -1; + int end = -1; if (mText != null) { start = getSelectionStart(); end = getSelectionEnd(); if (start >= 0 || end >= 0) { // Or save state if there is a selection - save = true; + hasSelection = true; } } - if (save) { + if (freezesText || hasSelection) { SavedState ss = new SavedState(superState); - // XXX Should also save the current scroll position! - ss.selStart = start; - ss.selEnd = end; - if (mText instanceof Spanned) { - Spannable sp = new SpannableStringBuilder(mText); + if (freezesText) { + if (mText instanceof Spanned) { + final Spannable sp = new SpannableStringBuilder(mText); - if (mEditor != null) { - removeMisspelledSpans(sp); - sp.removeSpan(mEditor.mSuggestionRangeSpan); + if (mEditor != null) { + removeMisspelledSpans(sp); + sp.removeSpan(mEditor.mSuggestionRangeSpan); + } + + ss.text = sp; + } else { + ss.text = mText.toString(); } + } - ss.text = sp; - } else { - ss.text = mText.toString(); + if (hasSelection) { + // XXX Should also save the current scroll position! + ss.selStart = start; + ss.selEnd = end; } if (isFocused() && start >= 0 && end >= 0) { @@ -4224,7 +4230,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * position. By default this is false, not saving the text. Set to true * if the text in the text view is not being saved somewhere else in * persistent storage (such as in a content provider) so that if the - * view is later thawed the user will not lose their data. + * view is later thawed the user will not lose their data. For + * {@link android.widget.EditText} it is always enabled, regardless of + * the value of the attribute. * * @param freezesText Controls whether a frozen icicle should include the * entire text data: true to include it, false to not. @@ -4238,7 +4246,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener /** * Return whether this text view is including its entire text contents - * in frozen icicles. + * in frozen icicles. For {@link android.widget.EditText} it always returns true. * * @return Returns true if text is included, false if it isn't. * @@ -5452,15 +5460,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return (int) Math.max(0, mShadowDy + mShadowRadius); } - private int getFudgedPaddingRight() { - // Add sufficient space for cursor and tone marks - int cursorWidth = 2 + (int)mTextPaint.density; // adequate for Material cursors - return Math.max(0, getCompoundPaddingRight() - (cursorWidth - 1)); - } - @Override protected int getRightPaddingOffset() { - return -(getFudgedPaddingRight() - mPaddingRight) + + return -(getCompoundPaddingRight() - mPaddingRight) + (int) Math.max(0, mShadowDx + mShadowRadius); } @@ -5805,7 +5807,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener float clipLeft = compoundPaddingLeft + scrollX; float clipTop = (scrollY == 0) ? 0 : extendedPaddingTop + scrollY; - float clipRight = right - left - getFudgedPaddingRight() + scrollX; + float clipRight = right - left - getCompoundPaddingRight() + scrollX; float clipBottom = bottom - top + scrollY - ((scrollY == maxScrollY) ? 0 : extendedPaddingBottom); @@ -10111,8 +10113,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * {@link View#onSaveInstanceState}. */ public static class SavedState extends BaseSavedState { - int selStart; - int selEnd; + int selStart = -1; + int selEnd = -1; CharSequence text; boolean frozenWithFocus; CharSequence error; diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index d4ada957a14a..b2ae835be358 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1706,7 +1706,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mDecorCaptionView.addView(root, new ViewGroup.MarginLayoutParams(MATCH_PARENT, MATCH_PARENT)); } else { - addView(root, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + + // Put it below the color views. + addView(root, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); } mContentRoot = (ViewGroup) root; initializeElevation(); diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java index 597c5225f89f..84d0fc70b1ca 100644 --- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java @@ -136,8 +136,7 @@ public class DividerSnapAlgorithm { / (mFirstSplitTarget.position - getStartInset()); } else if (position > mLastSplitTarget.position) { return (float) (position - mLastSplitTarget.position) - / (mDismissEndTarget.position - getEndInset() - - mLastSplitTarget.position - mDividerSize); + / (mDismissEndTarget.position - mLastSplitTarget.position - mDividerSize); } return 0f; } @@ -222,7 +221,8 @@ public class DividerSnapAlgorithm { addMiddleTarget(isHorizontalDivision); break; } - mTargets.add(new SnapTarget(dividerMax, SnapTarget.FLAG_DISMISS_END, 0.35f)); + int navBarSize = isHorizontalDivision ? mInsets.bottom : mInsets.right; + mTargets.add(new SnapTarget(dividerMax - navBarSize, SnapTarget.FLAG_DISMISS_END, 0.35f)); } private void addFixedDivisionTargets(boolean isHorizontalDivision) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4cddb6c1bac4..1db75e6337d1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -968,8 +968,7 @@ <!-- @SystemApi Allows an application to receive emergency cell broadcast messages, to record or display them to the user. - <p>Not for use by third-party applications. - @hide Pending API council approval --> + <p>Not for use by third-party applications. --> <permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST" android:protectionLevel="signature|privileged" /> @@ -2884,6 +2883,18 @@ <permission android:name="android.permission.DISPATCH_PROVISIONING_MESSAGE" android:protectionLevel="signature|privileged" /> + <!-- Allows the holder to read blocked numbers. See + {@link android.provider.BlockedNumberContract}. + @hide --> + <permission android:name="android.permission.READ_BLOCKED_NUMBERS" + android:protectionLevel="signature" /> + + <!-- Allows the holder to write blocked numbers. See + {@link android.provider.BlockedNumberContract}. + @hide --> + <permission android:name="android.permission.WRITE_BLOCKED_NUMBERS" + android:protectionLevel="signature" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/core/res/res/drawable/ic_arrow_drop_right_black_24dp.xml b/core/res/res/drawable/ic_arrow_drop_right_black_24dp.xml index 2dd0540f8bb5..62af834882dd 100644 --- a/core/res/res/drawable/ic_arrow_drop_right_black_24dp.xml +++ b/core/res/res/drawable/ic_arrow_drop_right_black_24dp.xml @@ -15,10 +15,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="25.0dp" - android:viewportHeight="25.0" + android:height="24.0dp" + android:viewportHeight="24.0" android:viewportWidth="24.0" - android:width="25.0dp" + android:width="24.0dp" android:tint="?attr/colorControlNormal" android:autoMirrored="true"> @@ -26,9 +26,8 @@ android:name="arrow" android:rotation="90.0" android:pivotX="12.0" - android:pivotY="13.0" - android:translateY="1.0"> + android:pivotY="12.0"> <path android:fillColor="#000000" android:pathData="M7,14 L12,9 L17,14 L7,14 Z" /> <path android:pathData="M0,0 L24,0 L24,24 L0,24 L0,0 Z" /> </group> -</vector>
\ No newline at end of file +</vector> diff --git a/core/res/res/values-mcc310-mnc160-af/strings.xml b/core/res/res/values-mcc310-mnc160-af/strings.xml new file mode 100644 index 000000000000..72ca2f25abed --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-af/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra jou diensverskaffer eers om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registreer by jou diensverskaffer"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi-oproep"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-am/strings.xml b/core/res/res/values-mcc310-mnc160-am/strings.xml new file mode 100644 index 000000000000..5a6635c0bf46 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-am/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ ይጠይቁ። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ።"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"የአገልግሎት አቅራቢዎ ጋር ይመዝገቡ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"የ%s Wi-Fi ጥሪ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ar/strings.xml b/core/res/res/values-mcc310-mnc160-ar/strings.xml new file mode 100644 index 000000000000..c0e42293ecf4 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ar/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذا الجهاز، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"التسجيل لدى مشغّل شبكة الجوّال"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s جارٍ الاتصال عبر Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-az-rAZ/strings.xml b/core/res/res/values-mcc310-mnc160-az-rAZ/strings.xml new file mode 100644 index 000000000000..0c250cdb10e2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-az-rAZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi üzərindən zəng etmək və mesaj göndərmək üçün ilk öncə operatordan bu xidməti ayarlamağı tələb edin. Sonra Ayarlardan Wi-Fi çağrısını aktivləşdirin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Operatorla qeydiyyatdan keçin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi Zəngi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-b+sr+Latn/strings.xml b/core/res/res/values-mcc310-mnc160-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..d351d5e6526b --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-b+sr+Latn/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrujte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Wi-Fi pozivanje preko operatera %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-bg/strings.xml b/core/res/res/values-mcc310-mnc160-bg/strings.xml new file mode 100644 index 000000000000..88715f5c1bc5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-bg/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Регистриране с оператора ви"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s – обаждания през Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-bn-rBD/strings.xml b/core/res/res/values-mcc310-mnc160-bn-rBD/strings.xml new file mode 100644 index 000000000000..0c3e816c77a3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-bn-rBD/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi এর মাধ্যমে কল করতে ও বার্তা পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট আপ করার বিষয়ে জিজ্ঞাসা করুন। তারপরে আবার সেটিংস থেকে Wi-Fi কলিং চালু করুন।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"আপনার পরিষেবা প্রদানকারীকে নথিভুক্ত করুন"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi কলিং"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ca/strings.xml b/core/res/res/values-mcc310-mnc160-ca/strings.xml new file mode 100644 index 000000000000..89baf1bcb50a --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ca/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi des de Configuració."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registra\'t amb el teu operador de telefonia mòbil"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Trucada per Wi-Fi amb %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-cs/strings.xml b/core/res/res/values-mcc310-mnc160-cs/strings.xml new file mode 100644 index 000000000000..3eb962ed2e5d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-cs/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Chcete-li volat a odesílat textové zprávy přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrace u operátora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Volání přes Wi-Fi: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-da/strings.xml b/core/res/res/values-mcc310-mnc160-da/strings.xml new file mode 100644 index 000000000000..8e401d8206ed --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-da/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Hvis du vil foretage opkald og sende beskeder via Wi-Fi, skal du først anmode dit mobilselskab om at konfigurere denne tjeneste. Derefter skal du slå Wi-Fi-opkald til igen fra Indstillinger."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrer dig hos dit mobilselskab"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi-opkald"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-de/strings.xml b/core/res/res/values-mcc310-mnc160-de/strings.xml new file mode 100644 index 000000000000..7b172d836bb7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-de/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann erneut über die Einstellungen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registriere dich bei deinem Mobilfunkanbieter."</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Anrufe über WLAN"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-el/strings.xml b/core/res/res/values-mcc310-mnc160-el/strings.xml new file mode 100644 index 000000000000..bfd09c0cde11 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-el/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά τη λειτουργία κλήσεων μέσω Wi-Fi από τις Ρυθμίσεις."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Κλήση Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-en-rAU/strings.xml b/core/res/res/values-mcc310-mnc160-en-rAU/strings.xml new file mode 100644 index 000000000000..d4f59ed50ff1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-en-rAU/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-en-rGB/strings.xml b/core/res/res/values-mcc310-mnc160-en-rGB/strings.xml new file mode 100644 index 000000000000..d4f59ed50ff1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-en-rGB/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-en-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-en-rIN/strings.xml new file mode 100644 index 000000000000..d4f59ed50ff1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-en-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-es-rUS/strings.xml b/core/res/res/values-mcc310-mnc160-es-rUS/strings.xml new file mode 100644 index 000000000000..8930a3e0d0ba --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-es-rUS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para realizar llamadas o enviar mensajes por Wi-Fi, primero solicítale al proveedor que instale el servicio. Luego, vuelve a activar las llamadas por Wi-Fi desde Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Regístrate con tu proveedor."</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Llamada por Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-es/strings.xml b/core/res/res/values-mcc310-mnc160-es/strings.xml new file mode 100644 index 000000000000..1aac00b423ae --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-es/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para hacer llamadas y enviar mensajes por Wi-Fi, debes pedir antes a tu operador que configure este servicio. Una vez hecho esto, vuelva a activar las llamadas Wi-Fi en Ajustes."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Regístrate con tu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Llamada Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-et-rEE/strings.xml b/core/res/res/values-mcc310-mnc160-et-rEE/strings.xml new file mode 100644 index 000000000000..c3be115735db --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-et-rEE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registreeruge operaatori juures"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Operaatori %s WiFi-kõned"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-eu-rES/strings.xml b/core/res/res/values-mcc310-mnc160-eu-rES/strings.xml new file mode 100644 index 000000000000..93c402605809 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-eu-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Erregistratu operadorearekin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi bidezko deiak"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-fa/strings.xml b/core/res/res/values-mcc310-mnc160-fa/strings.xml new file mode 100644 index 000000000000..247693a72a01 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-fa/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"برای برقراری تماس و ارسال پیام از طریق Wi-Fi، ابتدا از شرکت مخابراتیتان درخواست کنید این سرویس را راهاندازی کند. سپس دوباره از تنظیمات، تماس Wi-Fi را روشن کنید."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ثبت نام با شرکت مخابراتی شما"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"تماس %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-fi/strings.xml b/core/res/res/values-mcc310-mnc160-fi/strings.xml new file mode 100644 index 000000000000..aebdf71bf068 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-fi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Rekisteröidy operaattorisi asiakkaaksi."</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Wi-Fi-puhelut: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-fr-rCA/strings.xml b/core/res/res/values-mcc310-mnc160-fr-rCA/strings.xml new file mode 100644 index 000000000000..b0d21c2ee8a2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-fr-rCA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Inscrivez-vous auprès de votre fournisseur de services"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-fr/strings.xml b/core/res/res/values-mcc310-mnc160-fr/strings.xml new file mode 100644 index 000000000000..9fe787c6acec --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-fr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Pour effectuer des appels et envoyer des messages via le Wi-Fi, demandez tout d\'abord à votre opérateur de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Inscrivez-vous auprès de votre opérateur."</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-gl-rES/strings.xml b/core/res/res/values-mcc310-mnc160-gl-rES/strings.xml new file mode 100644 index 000000000000..f02d667d08e1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-gl-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro pídelle ao teu operador que configure este servizo. A continuación, activa de novo as chamadas por wifi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Rexístrate co teu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Chamadas por wifi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-gu-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-gu-rIN/strings.xml new file mode 100644 index 000000000000..e218ee6e0717 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-gu-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi પર કૉલ્સ કરવા અને સંદેશા મોકલવા માટે, પહેલા તમારા કેરીઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી Wi-Fi કૉલિંગ ચાલુ કરો."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"તમારા કેરીઅર સાથે નોંધણી કરો"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi કૉલિંગ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-hi/strings.xml b/core/res/res/values-mcc310-mnc160-hi/strings.xml new file mode 100644 index 000000000000..23f4dc886aa1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-hi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"वाई-फ़ाई से कॉल करने और संदेश भेजने के लिए, सबसे पहले अपने वाहक से इस सेवा को सेट करने के लिए कहें. उसके बाद सेटिंग से पुन: वाई-फ़ाई कॉलिंग चालू करें."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"अपने वाहक के साथ पंजीकृत करें"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s वाई-फ़ाई कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-hr/strings.xml b/core/res/res/values-mcc310-mnc160-hr/strings.xml new file mode 100644 index 000000000000..956093af1fdc --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-hr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Da biste telefonirali i slali pozive putem Wi-Fi-ja, morate tražiti od mobilnog operatera da vam postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u Postavkama."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrirajte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi pozivanje"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-hu/strings.xml b/core/res/res/values-mcc310-mnc160-hu/strings.xml new file mode 100644 index 000000000000..7dbf9e81b53d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-hu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Ha Wi-Fin szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután a Beállítások menüben kapcsolhatja be újra a Wi-Fi-hívást."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Regisztráljon szolgáltatójánál"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi-hívás"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-hy-rAM/strings.xml b/core/res/res/values-mcc310-mnc160-hy-rAM/strings.xml new file mode 100644 index 000000000000..aadc5091b2df --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-hy-rAM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ ծառայությունը կարգավորելու համար: Ապա նորից միացրեք Wi-Fi զանգերը Կարգավորումներում:"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Գրանցվեք օպերատորի մոտ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi զանգեր"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-in/strings.xml b/core/res/res/values-mcc310-mnc160-in/strings.xml new file mode 100644 index 000000000000..364029160d57 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-in/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Untuk melakukan panggilan telepon dan mengirim pesan melalui Wi-Fi, terlebih dahulu minta operator untuk menyiapkan layanan ini. Lalu, aktifkan lagi panggilan telepon Wi-Fi dari Setelan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Harap daftarkan ke operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Panggilan Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-is-rIS/strings.xml b/core/res/res/values-mcc310-mnc160-is-rIS/strings.xml new file mode 100644 index 000000000000..fd10da515789 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-is-rIS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Skráðu þig hjá símafyrirtækinu"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi símtöl"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-it/strings.xml b/core/res/res/values-mcc310-mnc160-it/strings.xml new file mode 100644 index 000000000000..d8479d3b5ff1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-it/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Per poter effettuare chiamate e inviare messaggi tramite Wi-Fi, devi chiedere all\'operatore di attivare il servizio. Dopodiché, riattiva le chiamate Wi-Fi dalle Impostazioni."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrati con il tuo operatore"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Chiamate Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-iw/strings.xml b/core/res/res/values-mcc310-mnc160-iw/strings.xml new file mode 100644 index 000000000000..2aa39370575e --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-iw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב התקשרות Wi-Fi מ\'הגדרות\'."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"הירשם אצל הספק"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"שיחות Wi-Fi של %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ja/strings.xml b/core/res/res/values-mcc310-mnc160-ja/strings.xml new file mode 100644 index 000000000000..e5893346479d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ja/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社にWi-Fiサービスを申し込んだ上で、設定画面でWi-Fi発信を再度ONにしてください。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"携帯通信会社に登録してください"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Wi-Fi通話(%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ka-rGE/strings.xml b/core/res/res/values-mcc310-mnc160-ka-rGE/strings.xml new file mode 100644 index 000000000000..2b8fd07aff6e --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ka-rGE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi-ს მეშვეობით ზარების განხორციელების ან შეტყობინების გაგზავნისათვის, პირველ რიგში დაეკითხეთ თქვენს ოპერატორს აღნიშნულ მომსახურებაზე. შემდეგ ხელახლა ჩართეთ Wi-Fi ზარები პარამეტრებიდან."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"დაარეგისტრირეთ თქვენი ოპერატორი"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s დარეკვა Wi-Fi-ს მეშვეობით"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-kk-rKZ/strings.xml b/core/res/res/values-mcc310-mnc160-kk-rKZ/strings.xml new file mode 100644 index 000000000000..b4f243364010 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-kk-rKZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi арқылы қоңырау шалу және хабарларды жіберу үшін алдымен жабдықтаушыңыздан осы қызметті орнатуды сұраңыз. Содан кейін Параметрлерден Wi-Fi қоңырау шалуын іске қосыңыз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Жабдықтаушыңыз арқылы тіркелу"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi арқылы қоңырау шалу"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-km-rKH/strings.xml b/core/res/res/values-mcc310-mnc160-km-rKH/strings.xml new file mode 100644 index 000000000000..1806fbc5d0aa --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-km-rKH/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"ដើម្បីធ្វើការហៅ និងផ្ញើសារតាម Wi-Fi ដំបូងឡើយអ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនរបស់អ្នកដំឡើងសេវាកម្មនេះសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតចេញពីការកំណត់។"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ចុះឈ្មោះជាមួយក្រុមហ៊ុនរបស់អ្នក"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"ការហៅតាមរយៈ Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-kn-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-kn-rIN/strings.xml new file mode 100644 index 000000000000..43d942abae1d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-kn-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi ಬಳಸಿಕೊಂಡು ಕರೆ ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಮೊದಲು ಈ ಸಾಧನವನ್ನು ಹೊಂದಿಸಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ತದನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮತ್ತೆ Wi-Fi ಆನ್ ಮಾಡಿ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ನಿಮ್ಮ ವಾಹಕದಲ್ಲಿ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಿ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi ಕರೆ ಮಾಡುವಿಕೆ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ko/strings.xml b/core/res/res/values-mcc310-mnc160-ko/strings.xml new file mode 100644 index 000000000000..9e1322328c70 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ko/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 이 기능을 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"이동통신사에 등록"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi 통화"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ky-rKG/strings.xml b/core/res/res/values-mcc310-mnc160-ky-rKG/strings.xml new file mode 100644 index 000000000000..8b88ac118cde --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ky-rKG/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде байланыш операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Операторуңузга катталыңыз"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi чалуу"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-lo-rLA/strings.xml b/core/res/res/values-mcc310-mnc160-lo-rLA/strings.xml new file mode 100644 index 000000000000..a5347a9f2537 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-lo-rLA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"ເພື່ອໂທ ແລະສົ່ງຂໍ້ຄວາມຢູ່ເທິງ Wi-Fi, ກ່ອນອື່ນໝົດໃຫ້ຖ້າມຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ ເພື່ອຕັ້ງການບໍລິການນີ້. ຈາກນັ້ນເປີດການໂທ Wi-Fi ອີກຈາກການຕັ້ງຄ່າ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ລົງທະບຽນກັບຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"ການໂທ %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-lt/strings.xml b/core/res/res/values-mcc310-mnc160-lt/strings.xml new file mode 100644 index 000000000000..81b748850638 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-lt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Jei norite skambinti ir siųsti pranešimus „Wi-Fi“ ryšiu, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite skambinimą „Wi-Fi“ ryšiu „Nustatymų“ skiltyje."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Užregistruokite pas operatorių"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"„%s“ „Wi-Fi“ skambinimas"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-lv/strings.xml b/core/res/res/values-mcc310-mnc160-lv/strings.xml new file mode 100644 index 000000000000..5d24c5f33ac8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-lv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoru iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Reģistrēt to pie sava mobilo sakaru operatora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi zvani"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-mk-rMK/strings.xml b/core/res/res/values-mcc310-mnc160-mk-rMK/strings.xml new file mode 100644 index 000000000000..aea280e47c67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-mk-rMK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"За повикување и испраќање пораки преку Wi-Fi, прво побарајте од операторот да ви ја постави оваа услуга. Потоа повторно вклучете повикување преку Wi-Fi во Поставки."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Регистрирајте се со операторот"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Повикување преку Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ml-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-ml-rIN/strings.xml new file mode 100644 index 000000000000..9e244ebe3ebc --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ml-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"വൈഫൈ വഴി കോളുകൾ വിളിക്കാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"നിങ്ങളുടെ കാരിയറിൽ രജിസ്റ്റർ ചെയ്യുക"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s വൈഫൈ കോളിംഗ്"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-mn-rMN/strings.xml b/core/res/res/values-mcc310-mnc160-mn-rMN/strings.xml new file mode 100644 index 000000000000..5b59d997dd80 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-mn-rMN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi-аар дуудлага хийх болон мессеж илгээхээр бол эхлээд оператороосоо энэ төхөөрөмжийг тохируулж өгөхийг хүсээрэй. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаагаарай."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Операторт бүртгүүлэх"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi Дуудлага"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-mr-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-mr-rIN/strings.xml new file mode 100644 index 000000000000..168c36ba5549 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-mr-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठविण्यासाठी, प्रथम आपल्या वाहकास ही सेवा सेट करण्यास सांगा. नंतर सेटिंग्जमधून पुन्हा वाय-फाय कॉलिंग चालू करा."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"आपल्या वाहकासह नोंदणी करा"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s वाय-फाय कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ms-rMY/strings.xml b/core/res/res/values-mcc310-mnc160-ms-rMY/strings.xml new file mode 100644 index 000000000000..74bd9d6ce0ab --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ms-rMY/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, mula-mula minta pembawa anda menyediakan perkhidmatan ini. Kemudian hidupkan panggilan Wi-Fi sekali lagi daripada Tetapan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Daftar dengan pembawa anda"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Panggilan Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-my-rMM/strings.xml b/core/res/res/values-mcc310-mnc160-my-rMM/strings.xml new file mode 100644 index 000000000000..ae87ae7d7450 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-my-rMM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"ဝိုင်ဖိုင်သုံး၍ ဖုန်းခေါ်ဆိုရန်နှင့် မက်စေ့ဂျ်များပို့ရန်၊ ဤဝန်ဆောင်မှုအား စတင်သုံးနိုင်ရန်အတွက် သင့် မိုဘိုင်းဝန်ဆောင်မှုအား ဦးစွာမေးမြန်းပါ။ ထို့နောက် ဆက်တင်မှတဆင့် ဝိုင်ဖိုင် ခေါ်ဆိုမှုအား ထပ်ဖွင့်ပါ။"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"သင့် မိုဘိုင်းဝန်ဆောင်မှုဖြင့် မှတ်ပုံတင်ရန်"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s ဝိုင်ဖိုင် ခေါ်ဆိုမှု"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-nb/strings.xml b/core/res/res/values-mcc310-mnc160-nb/strings.xml new file mode 100644 index 000000000000..34357e1300b0 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-nb/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"For å ringe og sende meldinger over Wi-Fi må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på Wi-Fi-anrop igjen fra Innstillinger."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrer deg hos operatøren din"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi-anrop"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ne-rNP/strings.xml b/core/res/res/values-mcc310-mnc160-ne-rNP/strings.xml new file mode 100644 index 000000000000..89562491086e --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ne-rNP/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi बाट कल गर्न र सन्देशहरू पठाउन, सबभन्दा पहिला यो सेवा सेटअप गर्न तपाईँको वाहकलाई भन्नुहोस्। त्यसपछि फेरि सेटिङहरूबाट Wi-Fi कलिङ सक्रिय पार्नुहोस्।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"आफ्नो वाहकसँग दर्ता गर्नुहोस्"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi कलिङ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-nl/strings.xml b/core/res/res/values-mcc310-mnc160-nl/strings.xml new file mode 100644 index 000000000000..319f799ebfc9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-nl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via \'Instellingen\'."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registreren bij je provider"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Bellen via wifi van %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-pa-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-pa-rIN/strings.xml new file mode 100644 index 000000000000..5641abebe79a --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-pa-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi ਤੇ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਹ ਸੇਵਾ ਸੈਟ ਅਪ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ Wi-Fi ਕਾਲਿੰਗ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਰਜਿਸਟਰ ਕਰੋ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi ਕਾਲਿੰਗ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-pl/strings.xml b/core/res/res/values-mcc310-mnc160-pl/strings.xml new file mode 100644 index 000000000000..1d916cb006f4 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-pl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Zarejestruj u operatora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Połączenia przez Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-pt-rBR/strings.xml b/core/res/res/values-mcc310-mnc160-pt-rBR/strings.xml new file mode 100644 index 000000000000..1c68cb14a300 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-pt-rBR/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-pt-rPT/strings.xml b/core/res/res/values-mcc310-mnc160-pt-rPT/strings.xml new file mode 100644 index 000000000000..86dba8c49713 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-pt-rPT/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar este serviço. Em seguida, nas Definições, ative novamente as Chamadas Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registar-se junto do seu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Chamadas Wi-Fi da %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-pt/strings.xml b/core/res/res/values-mcc310-mnc160-pt/strings.xml new file mode 100644 index 000000000000..1c68cb14a300 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-pt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ro/strings.xml b/core/res/res/values-mcc310-mnc160-ro/strings.xml new file mode 100644 index 000000000000..f2490d8fbf7d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ro/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Pentru a apela și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Înregistrați-vă la operatorul dvs."</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Apelare prin Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ru/strings.xml b/core/res/res/values-mcc310-mnc160-ru/strings.xml new file mode 100644 index 000000000000..9f2bc4357c8e --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ru/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо сначала обратиться к оператору связи и подключить эту услугу. После этого вы сможете снова выбрать этот параметр в настройках."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Укажите оператора и зарегистрируйтесь"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Звонки по Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-si-rLK/strings.xml b/core/res/res/values-mcc310-mnc160-si-rLK/strings.xml new file mode 100644 index 000000000000..0c133410892c --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-si-rLK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ඔබගේ වාහකය සමඟ ලියාපදිංචි වන්න"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi අමතමින්"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sk/strings.xml b/core/res/res/values-mcc310-mnc160-sk/strings.xml new file mode 100644 index 000000000000..3fe32f71edf8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrujte sa so svojím operátorom"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Volanie siete Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sl/strings.xml b/core/res/res/values-mcc310-mnc160-sl/strings.xml new file mode 100644 index 000000000000..381830976055 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registracija pri operaterju"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Klicanje prek Wi-Fi-ja (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sq-rAL/strings.xml b/core/res/res/values-mcc310-mnc160-sq-rAL/strings.xml new file mode 100644 index 000000000000..647cd03b5294 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sq-rAL/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Për të bërë telefonata dhe për të dërguar mesazhe me Wi-Fi, në fillim kërkoji operatorit celular ta konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi, nga Cilësimet."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Regjistrohu me operatorin tënd celular"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Telefonatat me Wi-Fi nga %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sr/strings.xml b/core/res/res/values-mcc310-mnc160-sr/strings.xml new file mode 100644 index 000000000000..7f8381a7f728 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Региструјте се код мобилног оператера"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Wi-Fi позивање преко оператера %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sv/strings.xml b/core/res/res/values-mcc310-mnc160-sv/strings.xml new file mode 100644 index 000000000000..e72b3b7c9c5d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Registrera dig hos operatören"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi-samtal"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-sw/strings.xml b/core/res/res/values-mcc310-mnc160-sw/strings.xml new file mode 100644 index 000000000000..08ee75361c26 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-sw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako asanidi huduma hii kwanza. Kisha uwashe tena upigaji simu kwa Wi-Fi kutoka kwenye Mipangilio."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Jisajili na mtoa huduma wako"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Upigaji Simu kwa Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ta-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-ta-rIN/strings.xml new file mode 100644 index 000000000000..d6ea49cd593a --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ta-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"வைஃபை மூலம் அழைக்க மற்றும் செய்திகள் அனுப்ப, முதலில் மொபைல் நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும்."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"உங்கள் மொபைல் நிறுவனத்தில் பதிவுசெய்யவும்"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s வைஃபை அழைப்பு"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-te-rIN/strings.xml b/core/res/res/values-mcc310-mnc160-te-rIN/strings.xml new file mode 100644 index 000000000000..61f392900fcc --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-te-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fiలో కాల్లు చేయడం మరియు సందేశాలు పంపడం కోసం ముందుగా ఈ సేవను సెటప్ చేయడానికి మీ క్యారియర్ను అడగండి. ఆపై సెట్టింగ్ల నుండి మళ్లీ Wi-Fi కాలింగ్ను ఆన్ చేయండి."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"మీ క్యారియర్తో నమోదు చేయండి"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi కాలింగ్"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-th/strings.xml b/core/res/res/values-mcc310-mnc160-th/strings.xml new file mode 100644 index 000000000000..f1ff305e5abf --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-th/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"ลงทะเบียนกับผู้ให้บริการ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"กำลังเรียก Wi-Fi ของ %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-tl/strings.xml b/core/res/res/values-mcc310-mnc160-tl/strings.xml new file mode 100644 index 000000000000..380b4103a7a5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-tl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Upang tumawag at magpadala ng mga mensahe sa pamamagitan ng Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay muling i-on ang pagtawag gamit ang Wi-Fi mula sa Mga Setting."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Magparehistro sa iyong carrier"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Pagtawag Gamit ang Wi-Fi ng %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-tr/strings.xml b/core/res/res/values-mcc310-mnc160-tr/strings.xml new file mode 100644 index 000000000000..2cb1dc91a845 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-tr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Kablosuz ağ üzerinden telefon etmek ve ileti göndermek için ilk önce operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra tekrar Ayarlar\'dan Kablosuz çağrı özelliğini açın."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Operatörünüze kaydolun"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Kablosuz Çağrı"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-uk/strings.xml b/core/res/res/values-mcc310-mnc160-uk/strings.xml new file mode 100644 index 000000000000..9e4d94ceda4e --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-uk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спершу попросіть свого оператора налаштувати цю послугу. Після цього ввімкніть дзвінки через Wi-Fi у налаштуваннях."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Зареєструйтеся в оператора"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Дзвінок через Wi-Fi від оператора %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-ur-rPK/strings.xml b/core/res/res/values-mcc310-mnc160-ur-rPK/strings.xml new file mode 100644 index 000000000000..e617582bdea9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-ur-rPK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کیلئے، پہلے اپنے کیریئر سے اس سروس کو ترتیب دینے کیلئے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"اپنے کیریئر کے ساتھ رجسٹر کریں"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi کالنگ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-uz-rUZ/strings.xml b/core/res/res/values-mcc310-mnc160-uz-rUZ/strings.xml new file mode 100644 index 000000000000..a951fc48ff53 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-uz-rUZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Mobil operatoringiz yordamida ro‘yxatdan o‘ting"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi qo‘ng‘iroqlar"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-vi/strings.xml b/core/res/res/values-mcc310-mnc160-vi/strings.xml new file mode 100644 index 000000000000..8f68be6ed4cf --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-vi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại Gọi qua Wi-Fi từ Cài đặt."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Đăng ký với nhà cung cấp dịch vụ của bạn"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"Gọi qua Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-zh-rCN/strings.xml b/core/res/res/values-mcc310-mnc160-zh-rCN/strings.xml new file mode 100644 index 000000000000..3b10a631d262 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-zh-rCN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"向您的运营商注册"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s WLAN 通话功能"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-zh-rHK/strings.xml b/core/res/res/values-mcc310-mnc160-zh-rHK/strings.xml new file mode 100644 index 000000000000..a39b37cd049d --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-zh-rHK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"如要透過 Wi-Fi 撥打電話及傳送訊息,請先向您的流動網絡供應商要求設定此服務。然後再次在「設定」中開啟 Wi-Fi 通話。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"向您的流動網絡供應商註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-zh-rTW/strings.xml b/core/res/res/values-mcc310-mnc160-zh-rTW/strings.xml new file mode 100644 index 000000000000..28690aa0ee6f --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-zh-rTW/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求您的行動通訊業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"向您的行動通訊業者註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc160-zu/strings.xml b/core/res/res/values-mcc310-mnc160-zu/strings.xml new file mode 100644 index 000000000000..d08486d68e28 --- /dev/null +++ b/core/res/res/values-mcc310-mnc160-zu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="3017901214286816293">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-Fi, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le divayisi. Bese uvula ukushaya kwe-Wi-Fi futhi kusukela kuzilungiselelo."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="7068215934335709161">"Bhalisa ngenkampani yakho yenethiwekhi"</item> + </string-array> + <string name="wfcSpnFormat" msgid="2031160810542298336">"%s ukushaya kwe-Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-af/strings.xml b/core/res/res/values-mcc310-mnc200-af/strings.xml new file mode 100644 index 000000000000..22d2685bd967 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-af/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra jou diensverskaffer eers om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registreer by jou diensverskaffer"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s-Wi-Fi-oproepe"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-am/strings.xml b/core/res/res/values-mcc310-mnc200-am/strings.xml new file mode 100644 index 000000000000..6592d18b7bb6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-am/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ ይጠይቁ። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ።"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"የአገልግሎት አቅራቢዎ ጋር ይመዝገቡ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"የ%s Wi-Fi ጥሪ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ar/strings.xml b/core/res/res/values-mcc310-mnc200-ar/strings.xml new file mode 100644 index 000000000000..ca411f687ba8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ar/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذه الخدمة، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"التسجيل لدى مشغّل شبكة الجوّال"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s جارٍ الاتصال عبر Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-az-rAZ/strings.xml b/core/res/res/values-mcc310-mnc200-az-rAZ/strings.xml new file mode 100644 index 000000000000..94e7f8888fd4 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-az-rAZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi üzərindən zəng etmək və mesaj göndərmək üçün ilk öncə operatordan bu xidməti ayarlamağı tələb edin. Sonra Ayarlardan Wi-Fi çağrısını aktivləşdirin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Operatorla qeydiyyatdan keçin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi Zəngi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-b+sr+Latn/strings.xml b/core/res/res/values-mcc310-mnc200-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..3dc4fff865a7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-b+sr+Latn/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrujte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Wi-Fi pozivanje preko operatera %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-bg/strings.xml b/core/res/res/values-mcc310-mnc200-bg/strings.xml new file mode 100644 index 000000000000..b190b7df61bc --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-bg/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо, помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Регистриране с оператора ви"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s – обаждания през Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-bn-rBD/strings.xml b/core/res/res/values-mcc310-mnc200-bn-rBD/strings.xml new file mode 100644 index 000000000000..26d6156b009e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-bn-rBD/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi এর মাধ্যমে কল করতে ও বার্তা পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট আপ করার বিষয়ে জিজ্ঞাসা করুন। তারপরে আবার সেটিংস থেকে Wi-Fi কলিং চালু করুন।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"আপনার পরিষেবা প্রদানকারীর সাথে নথিভুক্ত করুন"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi কলিং"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-bs-rBA/strings.xml b/core/res/res/values-mcc310-mnc200-bs-rBA/strings.xml new file mode 100644 index 000000000000..d9913af50ce3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-bs-rBA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Da biste pozivali i slali poruke preko Wi-Fi-ja, prvo zatražite od operatera da postavi tu uslugu. Potom u Postavkama ponovo uključite Wi-Fi pozivanje."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrirajte se kod operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi pozivanje"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ca/strings.xml b/core/res/res/values-mcc310-mnc200-ca/strings.xml new file mode 100644 index 000000000000..17e9a965e51d --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ca/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi des de Configuració."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registra\'t amb el teu operador de telefonia mòbil"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Trucades per Wi-Fi amb %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-cs/strings.xml b/core/res/res/values-mcc310-mnc200-cs/strings.xml new file mode 100644 index 000000000000..edfd91e57ccf --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-cs/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Chcete-li volat a odesílat textové zprávy přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrace u operátora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Volání přes Wi-Fi: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-da/strings.xml b/core/res/res/values-mcc310-mnc200-da/strings.xml new file mode 100644 index 000000000000..4fa58c913746 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-da/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Før du kan foretage opkald og sende beskeder via Wi-Fi, skal du anmode dit mobilselskab om at konfigurere denne tjeneste. Du skal derefter slå Wi-Fi-opkald til igen fra Indstillinger."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrer dig hos dit mobilselskab"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi-opkald"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-de/strings.xml b/core/res/res/values-mcc310-mnc200-de/strings.xml new file mode 100644 index 000000000000..83fca417221d --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-de/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registriere dich bei deinem Mobilfunkanbieter"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s-WLAN-Anrufe"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-el/strings.xml b/core/res/res/values-mcc310-mnc200-el/strings.xml new file mode 100644 index 000000000000..3e01614125a3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-el/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας που χρησιμοποιείτε να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά τη λειτουργία Κλήσης Wi-Fi από τις Ρυθμίσεις."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Κλήση Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-en-rAU/strings.xml b/core/res/res/values-mcc310-mnc200-en-rAU/strings.xml new file mode 100644 index 000000000000..78d5efe2de67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-en-rAU/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-en-rGB/strings.xml b/core/res/res/values-mcc310-mnc200-en-rGB/strings.xml new file mode 100644 index 000000000000..78d5efe2de67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-en-rGB/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-en-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-en-rIN/strings.xml new file mode 100644 index 000000000000..78d5efe2de67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-en-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-es-rUS/strings.xml b/core/res/res/values-mcc310-mnc200-es-rUS/strings.xml new file mode 100644 index 000000000000..f7e80c391519 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-es-rUS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para realizar llamadas y enviar mensajes con Wi-Fi, primero solicítale al proveedor que instale el servicio. Luego, vuelve a activar Llamada con Wi-Fi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Regístrate con tu proveedor"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Llamada con Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-es/strings.xml b/core/res/res/values-mcc310-mnc200-es/strings.xml new file mode 100644 index 000000000000..9ec401a74ad3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-es/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para hacer llamadas y enviar mensajes por Wi-Fi, solicita a tu operador que configure este servicio y, cuando lo haga, vuelve a activar las llamadas por Wi-Fi en Ajustes."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Regístrate con tu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Llamada por Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-et-rEE/strings.xml b/core/res/res/values-mcc310-mnc200-et-rEE/strings.xml new file mode 100644 index 000000000000..0635966c2e0c --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-et-rEE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registreeruge operaatori juures"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Operaatori %s WiFi-kõned"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-eu-rES/strings.xml b/core/res/res/values-mcc310-mnc200-eu-rES/strings.xml new file mode 100644 index 000000000000..5f8d8dc4c60e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-eu-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Erregistratu operadorearekin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi bidezko deiak"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-fa/strings.xml b/core/res/res/values-mcc310-mnc200-fa/strings.xml new file mode 100644 index 000000000000..698e2542a3ab --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-fa/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"برای برقراری تماس و ارسال پیام از طریق Wi-Fi، ابتدا از شرکت مخابراتیتان درخواست کنید این سرویس را راهاندازی کند. سپس دوباره در «تنظیمات»، تماس از طریق Wi-Fi را روشن کنید."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"از طریق شرکت مخابراتیتان ثبتنام کنید"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"تماس از طریق %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-fi/strings.xml b/core/res/res/values-mcc310-mnc200-fi/strings.xml new file mode 100644 index 000000000000..d011bd5a7fc7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-fi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Rekisteröidy operaattorisi asiakkaaksi."</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Wi-Fi-puhelut: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-fr-rCA/strings.xml b/core/res/res/values-mcc310-mnc200-fr-rCA/strings.xml new file mode 100644 index 000000000000..c69de437360d --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-fr-rCA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Inscrivez-vous auprès de votre fournisseur de services"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-fr/strings.xml b/core/res/res/values-mcc310-mnc200-fr/strings.xml new file mode 100644 index 000000000000..cbc6d3852092 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-fr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Inscrivez-vous auprès de votre opérateur."</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-gl-rES/strings.xml b/core/res/res/values-mcc310-mnc200-gl-rES/strings.xml new file mode 100644 index 000000000000..1736d77a5d0b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-gl-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro pídelle ao teu operador que configure este servizo. A continuación, activa de novo as chamadas por wifi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Rexístrate co teu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Chamadas por wifi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-gu-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-gu-rIN/strings.xml new file mode 100644 index 000000000000..a78ed0d75835 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-gu-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi પર કૉલ્સ કરવા અને સંદેશા મોકલવા માટે, પહેલા તમારા કેરીઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી Wi-Fi કૉલિંગ ચાલુ કરો."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"તમારા કેરીઅર સાથે નોંધણી કરો"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi કૉલિંગ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-hi/strings.xml b/core/res/res/values-mcc310-mnc200-hi/strings.xml new file mode 100644 index 000000000000..1d8272ad1603 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-hi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"वाई-फ़ाई से कॉल करने और संदेश भेजने के लिए, सबसे पहले अपने वाहक से इस सेवा को सेट करने के लिए कहें. उसके बाद सेटिंग से पुन: वाई-फ़ाई कॉलिंग चालू करें."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"अपने वाहक के साथ पंजीकृत करें"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s वाई-फ़ाई कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-hr/strings.xml b/core/res/res/values-mcc310-mnc200-hr/strings.xml new file mode 100644 index 000000000000..7977d96be3d8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-hr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Da biste telefonirali i slali poruke putem Wi-Fi-ja, od mobilnog operatera morate tražiti da vam postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u postavkama."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrirajte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi pozivi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-hu/strings.xml b/core/res/res/values-mcc310-mnc200-hu/strings.xml new file mode 100644 index 000000000000..daaf4f1edab2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-hu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Ha Wi-Fin szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután a Beállítások menüben kapcsolhatja be újra a Wi-Fi-hívást."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Regisztráljon szolgáltatójánál"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi-hívás"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-hy-rAM/strings.xml b/core/res/res/values-mcc310-mnc200-hy-rAM/strings.xml new file mode 100644 index 000000000000..36040e99ff33 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-hy-rAM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ ծառայությունը կարգավորելու համար: Ապա նորից միացրեք Wi-Fi զանգերը Կարգավորումներում:"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Գրանցվեք օպերատորի մոտ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi զանգեր"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-in/strings.xml b/core/res/res/values-mcc310-mnc200-in/strings.xml new file mode 100644 index 000000000000..c71dbf721acf --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-in/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Untuk melakukan panggilan telepon dan mengirim pesan melalui Wi-Fi, terlebih dahulu minta operator untuk menyiapkan layanan ini. Lalu, aktifkan lagi panggilan telepon Wi-Fi dari Setelan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Harap daftarkan ke operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Panggilan Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-is-rIS/strings.xml b/core/res/res/values-mcc310-mnc200-is-rIS/strings.xml new file mode 100644 index 000000000000..8c668367c78e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-is-rIS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Skráðu þig hjá símafyrirtækinu"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi símtöl"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-it/strings.xml b/core/res/res/values-mcc310-mnc200-it/strings.xml new file mode 100644 index 000000000000..cec5d8b4e5c3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-it/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Per poter effettuare chiamate e inviare messaggi tramite Wi-Fi, devi chiedere all\'operatore di attivare il servizio. Dopodiché, riattiva le chiamate Wi-Fi dalle Impostazioni."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrati con il tuo operatore"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Chiamate Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-iw/strings.xml b/core/res/res/values-mcc310-mnc200-iw/strings.xml new file mode 100644 index 000000000000..c409606b4f81 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-iw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"הירשם אצל הספק"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"שיחות Wi-Fi של %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ja/strings.xml b/core/res/res/values-mcc310-mnc200-ja/strings.xml new file mode 100644 index 000000000000..048681279dc0 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ja/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 発信を再度 ON にしてください。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"携帯通信会社に登録してください"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Wi-Fi 通話(%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ka-rGE/strings.xml b/core/res/res/values-mcc310-mnc200-ka-rGE/strings.xml new file mode 100644 index 000000000000..cb1734a0b7f9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ka-rGE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi-ს მეშვეობით ზარების განსახორციელებლად ან შეტყობინებების გასაგზავნად, პირველ რიგში, ამ სერვისის გააქტიურება თქვენს ოპერატორს უნდა თხოვოთ. შემდეგ ხელახლა ჩართეთ Wi-Fi დარეკვა პარამეტრებიდან."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"დარეგისტრირდით თქვენი ოპერატორის მეშვეობით"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Wi-Fi დარეკვა (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-kk-rKZ/strings.xml b/core/res/res/values-mcc310-mnc200-kk-rKZ/strings.xml new file mode 100644 index 000000000000..a7ba1f18196b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-kk-rKZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi арқылы қоңырау шалу және хабарларды жіберу үшін алдымен жабдықтаушыңыздан осы қызметті орнатуды сұраңыз. Содан кейін \"Параметрлер\" тармағында Wi-Fi қоңырауларын қосыңыз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Оператор арқылы тіркелу"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi қоңыраулары"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-km-rKH/strings.xml b/core/res/res/values-mcc310-mnc200-km-rKH/strings.xml new file mode 100644 index 000000000000..a0871a84ef5c --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-km-rKH/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"ដើម្បីធ្វើការហៅ និងផ្ញើសារតាម Wi-Fi ដំបូងឡើយអ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនរបស់អ្នកដំឡើងសេវាកម្មនេះសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតចេញពីការកំណត់។"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ចុះឈ្មោះជាមួយក្រុមហ៊ុនរបស់អ្នក"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"ការហៅតាមរយៈ Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-kn-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-kn-rIN/strings.xml new file mode 100644 index 000000000000..4428f824ce2e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-kn-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"ವೈ-ಫೈ ಬಳಸಿಕೊಂಡು ಕರೆ ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಮೊದಲು ಈ ಸಾಧನವನ್ನು ಹೊಂದಿಸಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ತದನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮತ್ತೆ ವೈ-ಫೈ ಆನ್ ಮಾಡಿ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ನಿಮ್ಮ ವಾಹಕದಲ್ಲಿ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಿ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ko/strings.xml b/core/res/res/values-mcc310-mnc200-ko/strings.xml new file mode 100644 index 000000000000..b42cc0510753 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ko/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 이 기능을 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"이동통신사에 등록"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi 통화"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ky-rKG/strings.xml b/core/res/res/values-mcc310-mnc200-ky-rKG/strings.xml new file mode 100644 index 000000000000..896afde6acef --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ky-rKG/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Операторуңузга катталыңыз"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi чалуу"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-lo-rLA/strings.xml b/core/res/res/values-mcc310-mnc200-lo-rLA/strings.xml new file mode 100644 index 000000000000..4476900d927b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-lo-rLA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"ເພື່ອໂທ ແລະ ສົ່ງຂໍ້ຄວາມຜ່ານ Wi-Fi, ໃຫ້ແຈ້ງຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານເພື່ອຕັ້ງບໍລິການນີ້ກ່ອນ. ຈາກນັ້ນ ເປີດການໂທ Wi-Fi ອີກເທື່ອໜຶ່ງຈາກການຕັ້ງຄ່າ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ລົງທະບຽນນໍາຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"ການໂທ %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-lt/strings.xml b/core/res/res/values-mcc310-mnc200-lt/strings.xml new file mode 100644 index 000000000000..4fb0510fa5fc --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-lt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Jei norite skambinti ir siųsti pranešimus naudodami „Wi-Fi“, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite „Wi-Fi“ skambinimą Nustatymų skiltyje."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Užregistruokite pas operatorių"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"„%s“ „Wi-Fi“ skambinimas"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-lv/strings.xml b/core/res/res/values-mcc310-mnc200-lv/strings.xml new file mode 100644 index 000000000000..0471418cbb2f --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-lv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoram iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Reģistrējieties pie sava mobilo sakaru operatora."</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi zvani"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-mk-rMK/strings.xml b/core/res/res/values-mcc310-mnc200-mk-rMK/strings.xml new file mode 100644 index 000000000000..2582e2ac45ed --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-mk-rMK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"За повикување и испраќање пораки преку Wi-Fi, прво побарајте од операторот да ви ја постави оваа услуга. Потоа повторно вклучете Повици преку Wi-Fi во Поставки."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Регистрирајте се кај операторот"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Повици преку Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ml-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-ml-rIN/strings.xml new file mode 100644 index 000000000000..6bdde6d3c663 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ml-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"വൈഫൈ വഴി കോളുകൾ വിളിക്കാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"നിങ്ങളുടെ കാരിയറിൽ രജിസ്റ്റർ ചെയ്യുക"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s വൈഫൈ കോളിംഗ്"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-mn-rMN/strings.xml b/core/res/res/values-mcc310-mnc200-mn-rMN/strings.xml new file mode 100644 index 000000000000..0d24a34a9dba --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-mn-rMN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi дуудлага хийх болон зурвас илгээх бол эхлээд оператор компаниасаа энэ төхөөрөмжийг тохируулахыг хүснэ үү. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаана уу."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Оператор компанидаа бүртгүүлэх"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi Дуудлага"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-mr-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-mr-rIN/strings.xml new file mode 100644 index 000000000000..fc89cfca8551 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-mr-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठविण्यासाठी, प्रथम आपल्या वाहकास ही सेवा सेट करण्यास सांगा. नंतर सेटिंग्जमधून पुन्हा वाय-फाय कॉलिंग चालू करा."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"आपल्या वाहकासह नोंदणी करा"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s वाय-फाय कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ms-rMY/strings.xml b/core/res/res/values-mcc310-mnc200-ms-rMY/strings.xml new file mode 100644 index 000000000000..f658b8dc9cd7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ms-rMY/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, mula-mula minta pembawa anda menyediakan perkhidmatan ini. Kemudian, hidupkan panggilan Wi-Fi sekali lagi daripada Tetapan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Daftar dengan pembawa anda"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Panggilan Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-my-rMM/strings.xml b/core/res/res/values-mcc310-mnc200-my-rMM/strings.xml new file mode 100644 index 000000000000..b91c2d04f05f --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-my-rMM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"ဝိုင်ဖိုင်ကိုအသုံးပြု၍ ဖုန်းခေါ်ဆိုရန်နှင့် စာပို့ရန်၊ ဤစက်ပစ္စည်းကို တပ်ဆင်ရန် သင့်အသုံးပြုသည့်မိုဘိုင်းဝန်ဆောင်မှုအား ဦးစွာမေးပါ။ ထို့နောက် ဆက်တင်များထဲမှ ဝိုင်ဖိုင်ခေါ်ဆိုမှုကို ဖွင့်ပါ။"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"သင့်အသုံးပြုသည့်မိုဘိုင်းဝန်ဆောင်မှုဖြင့် မှတ်ပုံတင်ရန်"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-nb/strings.xml b/core/res/res/values-mcc310-mnc200-nb/strings.xml new file mode 100644 index 000000000000..353da1084ec6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-nb/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Du må be operatøren din om å konfigurere denne tjenesten før du kan ringe og sende meldinger via Wi-Fi. Deretter slår du på Wi-Fi-anrop igjen fra innstillingene."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrer deg hos operatøren din"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi-anrop"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ne-rNP/strings.xml b/core/res/res/values-mcc310-mnc200-ne-rNP/strings.xml new file mode 100644 index 000000000000..5362798c5fe7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ne-rNP/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi मार्फत कल गर्न र सन्देशहरू पठाउन, सबभन्दा पहिले यो सेवा सेटअप गर्न तपाईँको वाहकलाई भन्नुहोस्। त्यसपछि फेरि सेटिङहरूबाट Wi-Fi कलिङ सक्रिय पार्नुहोस्।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"तपाईंको वाहकसँगै दर्ता गर्नुहोस्"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi कलिङ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-nl/strings.xml b/core/res/res/values-mcc310-mnc200-nl/strings.xml new file mode 100644 index 000000000000..22f8de25bc44 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-nl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registreren bij je provider"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Bellen via wifi van %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-pa-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-pa-rIN/strings.xml new file mode 100644 index 000000000000..0083af30640b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-pa-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi \'ਤੇ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਹ ਸੇਵਾ ਸੈੱਟ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਤੋਂ Wi-Fi ਕਾਲਿੰਗ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਰਜਿਸਟਰ ਕਰੋ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi ਕਾਲਿੰਗ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-pl/strings.xml b/core/res/res/values-mcc310-mnc200-pl/strings.xml new file mode 100644 index 000000000000..0ce774d92a3e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-pl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Zarejestruj u operatora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Połączenia przez Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-pt-rBR/strings.xml b/core/res/res/values-mcc310-mnc200-pt-rBR/strings.xml new file mode 100644 index 000000000000..23f318234842 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-pt-rBR/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-pt-rPT/strings.xml b/core/res/res/values-mcc310-mnc200-pt-rPT/strings.xml new file mode 100644 index 000000000000..ff78c26b536c --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-pt-rPT/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar o serviço. Em seguida, nas Definições, ative novamente as Chamadas Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registar-se junto do seu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Chamadas Wi-Fi da %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-pt/strings.xml b/core/res/res/values-mcc310-mnc200-pt/strings.xml new file mode 100644 index 000000000000..23f318234842 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-pt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ro/strings.xml b/core/res/res/values-mcc310-mnc200-ro/strings.xml new file mode 100644 index 000000000000..028a70b3278f --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ro/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Pentru a apela și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Înregistrați-vă la operatorul dvs."</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Apelare prin Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ru/strings.xml b/core/res/res/values-mcc310-mnc200-ru/strings.xml new file mode 100644 index 000000000000..23a4c345b6ee --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ru/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо сначала обратиться к оператору связи и подключить эту услугу. После этого вы сможете снова выбрать этот параметр в настройках."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Укажите оператора и зарегистрируйтесь"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Звонки по Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-si-rLK/strings.xml b/core/res/res/values-mcc310-mnc200-si-rLK/strings.xml new file mode 100644 index 000000000000..f11ade3b5b5b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-si-rLK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ඔබගේ වාහකය සමඟ ලියාපදිංචි වන්න"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi අමතමින්"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sk/strings.xml b/core/res/res/values-mcc310-mnc200-sk/strings.xml new file mode 100644 index 000000000000..a64f9ecb5dec --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrujte sa so svojím operátorom"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Volanie cez Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sl/strings.xml b/core/res/res/values-mcc310-mnc200-sl/strings.xml new file mode 100644 index 000000000000..06c3d2212756 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registracija pri operaterju"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Klicanje prek omrežja Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sq-rAL/strings.xml b/core/res/res/values-mcc310-mnc200-sq-rAL/strings.xml new file mode 100644 index 000000000000..998d2fe7bfb6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sq-rAL/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Për të bërë telefonata dhe për të dërguar mesazhe me Wi-Fi, në fillim kërkoji operatorit celular ta konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi, nga Cilësimet."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Regjistrohu me operatorin tënd celular"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Telefonatat me Wi-Fi nga %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sr/strings.xml b/core/res/res/values-mcc310-mnc200-sr/strings.xml new file mode 100644 index 000000000000..20e994688c32 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Региструјте се код мобилног оператера"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Wi-Fi позивање преко оператера %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sv/strings.xml b/core/res/res/values-mcc310-mnc200-sv/strings.xml new file mode 100644 index 000000000000..3302b938d4f9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Registrera dig hos operatören"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi-samtal"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-sw/strings.xml b/core/res/res/values-mcc310-mnc200-sw/strings.xml new file mode 100644 index 000000000000..e53ca0b7cc1b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-sw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako asanidi huduma hii kwanza. Kisha uwashe tena upigaji simu kwa Wi-Fi kutoka kwenye Mipangilio."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Jisajili na mtoa huduma wako"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Upigaji Simu kwa Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ta-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-ta-rIN/strings.xml new file mode 100644 index 000000000000..49fecea5be5d --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ta-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"வைஃபை மூலம் அழைக்க மற்றும் செய்திகள் அனுப்ப, முதலில் மொபைல் நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும்."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"உங்கள் மொபைல் நிறுவனத்தில் பதிவுசெய்யவும்"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s வைஃபை அழைப்பு"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-te-rIN/strings.xml b/core/res/res/values-mcc310-mnc200-te-rIN/strings.xml new file mode 100644 index 000000000000..85f29eecd08b --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-te-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fiలో కాల్లు చేయడానికి మరియు సందేశాలు పంపడానికి, ముందుగా ఈ సేవను సెటప్ చేయమని మీ క్యారియర్ను అడగండి. ఆపై సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ను మళ్లీ ఆన్ చేయండి."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"మీ క్యారియర్తో నమోదు చేయండి"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi కాలింగ్"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-th/strings.xml b/core/res/res/values-mcc310-mnc200-th/strings.xml new file mode 100644 index 000000000000..4758586d188d --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-th/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"ลงทะเบียนกับผู้ให้บริการ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"การโทรผ่าน Wi-Fi ของ %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-tl/strings.xml b/core/res/res/values-mcc310-mnc200-tl/strings.xml new file mode 100644 index 000000000000..b7f41c703dbb --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-tl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Upang tumawag at magpadala ng mga mensahe sa pamamagitan ng Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay muling i-on ang pagtawag sa Wi-Fi mula sa Mga Setting."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Magparehistro sa iyong carrier"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Pagtawag Gamit ang Wi-Fi ng %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-tr/strings.xml b/core/res/res/values-mcc310-mnc200-tr/strings.xml new file mode 100644 index 000000000000..e104eb9dfddf --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-tr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Kablosuz ağ üzerinden telefon etmek ve ileti göndermek için ilk önce operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra, Ayarlar\'dan Kablosuz çağrı özelliğini tekrar açın."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Operatörünüze kaydolun"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Kablosuz Çağrı"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-uk/strings.xml b/core/res/res/values-mcc310-mnc200-uk/strings.xml new file mode 100644 index 000000000000..3780843ceb7e --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-uk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спершу попросіть свого оператора налаштувати цю послугу. Після цього ввімкніть дзвінки через Wi-Fi у налаштуваннях."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Зареєструйтеся в оператора"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Дзвінок через Wi-Fi від оператора %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-ur-rPK/strings.xml b/core/res/res/values-mcc310-mnc200-ur-rPK/strings.xml new file mode 100644 index 000000000000..5a2de77a4392 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-ur-rPK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کیلئے، پہلے اپنے کیریئر سے اس سروس کو سیٹ اپ کرنے کیلئے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"اپنے کیریئر کے ساتھ رجسٹر کریں"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi کالنگ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-uz-rUZ/strings.xml b/core/res/res/values-mcc310-mnc200-uz-rUZ/strings.xml new file mode 100644 index 000000000000..5f0fefe22d2f --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-uz-rUZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Mobil operatoringiz yordamida ro‘yxatdan o‘ting"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi qo‘ng‘iroqlar"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-vi/strings.xml b/core/res/res/values-mcc310-mnc200-vi/strings.xml new file mode 100644 index 000000000000..55b5c52fa418 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-vi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Đăng ký với nhà cung cấp dịch vụ của bạn"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"Gọi điện qua Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-zh-rCN/strings.xml b/core/res/res/values-mcc310-mnc200-zh-rCN/strings.xml new file mode 100644 index 000000000000..6c2a8d9338ee --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-zh-rCN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"向您的运营商注册"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s WLAN 通话功能"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-zh-rHK/strings.xml b/core/res/res/values-mcc310-mnc200-zh-rHK/strings.xml new file mode 100644 index 000000000000..61bd0a10f091 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-zh-rHK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"如要透過 Wi-Fi 撥打電話和傳送訊息,請先向流動網絡供應商要求設定此服務,然後再次在「設定」中開啟 [Wi-Fi 通話]。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"向您的流動網絡供應商註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-zh-rTW/strings.xml b/core/res/res/values-mcc310-mnc200-zh-rTW/strings.xml new file mode 100644 index 000000000000..9658757ab6e7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-zh-rTW/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"如要透過 Wi-Fi 撥打電話及傳送訊息,請先要求您的行動通訊業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"向您的行動通訊業者註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc200-zu/strings.xml b/core/res/res/values-mcc310-mnc200-zu/strings.xml new file mode 100644 index 000000000000..f4209a633b67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc200-zu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="9107329079910661798">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-Fi, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le divayisi. Bese uvula ukushaya kwe-Wi-Fi futhi kusukela kuzilungiselelo."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2841003137832065541">"Bhalisa ngenkampani yakho yenethiwekhi"</item> + </string-array> + <string name="wfcSpnFormat" msgid="6806975706640442517">"%s ukushaya kwe-Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-af/strings.xml b/core/res/res/values-mcc310-mnc210-af/strings.xml new file mode 100644 index 000000000000..7edb2bf904cd --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-af/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra jou diensverskaffer eers om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registreer by jou diensverskaffer"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s-Wi-Fi-oproepe"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-am/strings.xml b/core/res/res/values-mcc310-mnc210-am/strings.xml new file mode 100644 index 000000000000..9eb932423f59 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-am/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ ይጠይቁ። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ።"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"የአገልግሎት አቅራቢዎ ጋር ይመዝገቡ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"የ%s Wi-Fi ጥሪ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ar/strings.xml b/core/res/res/values-mcc310-mnc210-ar/strings.xml new file mode 100644 index 000000000000..9d5893d6d229 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ar/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذه الخدمة، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"التسجيل لدى مشغّل شبكة الجوّال"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s جارٍ الاتصال عبر Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-az-rAZ/strings.xml b/core/res/res/values-mcc310-mnc210-az-rAZ/strings.xml new file mode 100644 index 000000000000..6a818359c61b --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-az-rAZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi üzərindən zəng etmək və mesaj göndərmək üçün ilk öncə operatordan bu xidməti ayarlamağı tələb edin. Sonra Ayarlardan Wi-Fi çağrısını aktivləşdirin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Operatorla qeydiyyatdan keçin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi Zəngi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-b+sr+Latn/strings.xml b/core/res/res/values-mcc310-mnc210-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..dd43d615afb6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-b+sr+Latn/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrujte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Wi-Fi pozivanje preko operatera %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-bg/strings.xml b/core/res/res/values-mcc310-mnc210-bg/strings.xml new file mode 100644 index 000000000000..b1ae65b89b23 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-bg/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо, помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Регистриране с оператора ви"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s – обаждания през Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-bn-rBD/strings.xml b/core/res/res/values-mcc310-mnc210-bn-rBD/strings.xml new file mode 100644 index 000000000000..b4d000da3d56 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-bn-rBD/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi এর মাধ্যমে কল করতে ও বার্তা পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট আপ করার বিষয়ে জিজ্ঞাসা করুন। তারপরে আবার সেটিংস থেকে Wi-Fi কলিং চালু করুন।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"আপনার পরিষেবা প্রদানকারীর সাথে নথিভুক্ত করুন"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi কলিং"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-bs-rBA/strings.xml b/core/res/res/values-mcc310-mnc210-bs-rBA/strings.xml new file mode 100644 index 000000000000..c9ee9f7e750c --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-bs-rBA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Da biste pozivali i slali poruke preko Wi-Fi-ja, prvo zatražite od operatera da postavi tu uslugu. Potom u Postavkama ponovo uključite Wi-Fi pozivanje."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrirajte se kod operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi pozivanje"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ca/strings.xml b/core/res/res/values-mcc310-mnc210-ca/strings.xml new file mode 100644 index 000000000000..aaa95cf8a086 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ca/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi des de Configuració."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registra\'t amb el teu operador de telefonia mòbil"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Trucades per Wi-Fi amb %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-cs/strings.xml b/core/res/res/values-mcc310-mnc210-cs/strings.xml new file mode 100644 index 000000000000..70c727e27b8f --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-cs/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Chcete-li volat a odesílat textové zprávy přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrace u operátora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Volání přes Wi-Fi: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-da/strings.xml b/core/res/res/values-mcc310-mnc210-da/strings.xml new file mode 100644 index 000000000000..e50fec02de84 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-da/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Før du kan foretage opkald og sende beskeder via Wi-Fi, skal du anmode dit mobilselskab om at konfigurere denne tjeneste. Du skal derefter slå Wi-Fi-opkald til igen fra Indstillinger."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrer dig hos dit mobilselskab"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi-opkald"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-de/strings.xml b/core/res/res/values-mcc310-mnc210-de/strings.xml new file mode 100644 index 000000000000..40be9d5e8946 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-de/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registriere dich bei deinem Mobilfunkanbieter"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s-WLAN-Anrufe"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-el/strings.xml b/core/res/res/values-mcc310-mnc210-el/strings.xml new file mode 100644 index 000000000000..18ebf120df22 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-el/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας που χρησιμοποιείτε να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά τη λειτουργία Κλήσης Wi-Fi από τις Ρυθμίσεις."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Κλήση Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-en-rAU/strings.xml b/core/res/res/values-mcc310-mnc210-en-rAU/strings.xml new file mode 100644 index 000000000000..ff31e926ac4d --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-en-rAU/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-en-rGB/strings.xml b/core/res/res/values-mcc310-mnc210-en-rGB/strings.xml new file mode 100644 index 000000000000..ff31e926ac4d --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-en-rGB/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-en-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-en-rIN/strings.xml new file mode 100644 index 000000000000..ff31e926ac4d --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-en-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Register with your operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi Calling"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-es-rUS/strings.xml b/core/res/res/values-mcc310-mnc210-es-rUS/strings.xml new file mode 100644 index 000000000000..86cbdf191c88 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-es-rUS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para realizar llamadas y enviar mensajes con Wi-Fi, primero solicítale al proveedor que instale el servicio. Luego, vuelve a activar Llamada con Wi-Fi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Regístrate con tu proveedor"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Llamada con Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-es/strings.xml b/core/res/res/values-mcc310-mnc210-es/strings.xml new file mode 100644 index 000000000000..8fe5eba15927 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-es/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para hacer llamadas y enviar mensajes por Wi-Fi, solicita a tu operador que configure este servicio y, cuando lo haga, vuelve a activar las llamadas por Wi-Fi en Ajustes."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Regístrate con tu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Llamada por Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-et-rEE/strings.xml b/core/res/res/values-mcc310-mnc210-et-rEE/strings.xml new file mode 100644 index 000000000000..3da18661b5fb --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-et-rEE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registreeruge operaatori juures"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Operaatori %s WiFi-kõned"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-eu-rES/strings.xml b/core/res/res/values-mcc310-mnc210-eu-rES/strings.xml new file mode 100644 index 000000000000..b0332314aece --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-eu-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Erregistratu operadorearekin"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi bidezko deiak"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-fa/strings.xml b/core/res/res/values-mcc310-mnc210-fa/strings.xml new file mode 100644 index 000000000000..8cb15f7858c1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-fa/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"برای برقراری تماس و ارسال پیام از طریق Wi-Fi، ابتدا از شرکت مخابراتیتان درخواست کنید این سرویس را راهاندازی کند. سپس دوباره در «تنظیمات»، تماس از طریق Wi-Fi را روشن کنید."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"از طریق شرکت مخابراتیتان ثبتنام کنید"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"تماس از طریق %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-fi/strings.xml b/core/res/res/values-mcc310-mnc210-fi/strings.xml new file mode 100644 index 000000000000..b0818451b7de --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-fi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Rekisteröidy operaattorisi asiakkaaksi."</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Wi-Fi-puhelut: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-fr-rCA/strings.xml b/core/res/res/values-mcc310-mnc210-fr-rCA/strings.xml new file mode 100644 index 000000000000..43d9d93c586e --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-fr-rCA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Inscrivez-vous auprès de votre fournisseur de services"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-fr/strings.xml b/core/res/res/values-mcc310-mnc210-fr/strings.xml new file mode 100644 index 000000000000..6b3cacbf2a26 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-fr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Inscrivez-vous auprès de votre opérateur."</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-gl-rES/strings.xml b/core/res/res/values-mcc310-mnc210-gl-rES/strings.xml new file mode 100644 index 000000000000..fe2a326d138e --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-gl-rES/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro pídelle ao teu operador que configure este servizo. A continuación, activa de novo as chamadas por wifi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Rexístrate co teu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Chamadas por wifi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-gu-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-gu-rIN/strings.xml new file mode 100644 index 000000000000..ccb4be4b3fb6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-gu-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi પર કૉલ્સ કરવા અને સંદેશા મોકલવા માટે, પહેલા તમારા કેરીઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી Wi-Fi કૉલિંગ ચાલુ કરો."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"તમારા કેરીઅર સાથે નોંધણી કરો"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi કૉલિંગ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-hi/strings.xml b/core/res/res/values-mcc310-mnc210-hi/strings.xml new file mode 100644 index 000000000000..b560f048e4d2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-hi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"वाई-फ़ाई से कॉल करने और संदेश भेजने के लिए, सबसे पहले अपने वाहक से इस सेवा को सेट करने के लिए कहें. उसके बाद सेटिंग से पुन: वाई-फ़ाई कॉलिंग चालू करें."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"अपने वाहक के साथ पंजीकृत करें"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s वाई-फ़ाई कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-hr/strings.xml b/core/res/res/values-mcc310-mnc210-hr/strings.xml new file mode 100644 index 000000000000..caf5df9ee1b8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-hr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Da biste telefonirali i slali poruke putem Wi-Fi-ja, od mobilnog operatera morate tražiti da vam postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u postavkama."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrirajte se kod mobilnog operatera"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi pozivi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-hu/strings.xml b/core/res/res/values-mcc310-mnc210-hu/strings.xml new file mode 100644 index 000000000000..f7465a4316d7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-hu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Ha Wi-Fin szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután a Beállítások menüben kapcsolhatja be újra a Wi-Fi-hívást."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Regisztráljon szolgáltatójánál"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi-hívás"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-hy-rAM/strings.xml b/core/res/res/values-mcc310-mnc210-hy-rAM/strings.xml new file mode 100644 index 000000000000..69623ffce5da --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-hy-rAM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ ծառայությունը կարգավորելու համար: Ապա նորից միացրեք Wi-Fi զանգերը Կարգավորումներում:"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Գրանցվեք օպերատորի մոտ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi զանգեր"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-in/strings.xml b/core/res/res/values-mcc310-mnc210-in/strings.xml new file mode 100644 index 000000000000..264bb51b14b1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-in/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Untuk melakukan panggilan telepon dan mengirim pesan melalui Wi-Fi, terlebih dahulu minta operator untuk menyiapkan layanan ini. Lalu, aktifkan lagi panggilan telepon Wi-Fi dari Setelan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Harap daftarkan ke operator"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Panggilan Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-is-rIS/strings.xml b/core/res/res/values-mcc310-mnc210-is-rIS/strings.xml new file mode 100644 index 000000000000..f2433a0d14f7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-is-rIS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Skráðu þig hjá símafyrirtækinu"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi símtöl"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-it/strings.xml b/core/res/res/values-mcc310-mnc210-it/strings.xml new file mode 100644 index 000000000000..a307e4a0ecc2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-it/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Per poter effettuare chiamate e inviare messaggi tramite Wi-Fi, devi chiedere all\'operatore di attivare il servizio. Dopodiché, riattiva le chiamate Wi-Fi dalle Impostazioni."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrati con il tuo operatore"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Chiamate Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-iw/strings.xml b/core/res/res/values-mcc310-mnc210-iw/strings.xml new file mode 100644 index 000000000000..4ecc513ae6f4 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-iw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"הירשם אצל הספק"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"שיחות Wi-Fi של %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ja/strings.xml b/core/res/res/values-mcc310-mnc210-ja/strings.xml new file mode 100644 index 000000000000..4cf6215c171a --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ja/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 発信を再度 ON にしてください。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"携帯通信会社に登録してください"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Wi-Fi 通話(%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ka-rGE/strings.xml b/core/res/res/values-mcc310-mnc210-ka-rGE/strings.xml new file mode 100644 index 000000000000..d12328c2ebe9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ka-rGE/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi-ს მეშვეობით ზარების განსახორციელებლად ან შეტყობინებების გასაგზავნად, პირველ რიგში, ამ სერვისის გააქტიურება თქვენს ოპერატორს უნდა თხოვოთ. შემდეგ ხელახლა ჩართეთ Wi-Fi დარეკვა პარამეტრებიდან."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"დარეგისტრირდით თქვენი ოპერატორის მეშვეობით"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Wi-Fi დარეკვა (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-kk-rKZ/strings.xml b/core/res/res/values-mcc310-mnc210-kk-rKZ/strings.xml new file mode 100644 index 000000000000..cc6b0220cb11 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-kk-rKZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi арқылы қоңырау шалу және хабарларды жіберу үшін алдымен жабдықтаушыңыздан осы қызметті орнатуды сұраңыз. Содан кейін \"Параметрлер\" тармағында Wi-Fi қоңырауларын қосыңыз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Оператор арқылы тіркелу"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi қоңыраулары"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-km-rKH/strings.xml b/core/res/res/values-mcc310-mnc210-km-rKH/strings.xml new file mode 100644 index 000000000000..7a19737e2586 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-km-rKH/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"ដើម្បីធ្វើការហៅ និងផ្ញើសារតាម Wi-Fi ដំបូងឡើយអ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនរបស់អ្នកដំឡើងសេវាកម្មនេះសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតចេញពីការកំណត់។"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ចុះឈ្មោះជាមួយក្រុមហ៊ុនរបស់អ្នក"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"ការហៅតាមរយៈ Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-kn-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-kn-rIN/strings.xml new file mode 100644 index 000000000000..037ccda66df6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-kn-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"ವೈ-ಫೈ ಬಳಸಿಕೊಂಡು ಕರೆ ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಮೊದಲು ಈ ಸಾಧನವನ್ನು ಹೊಂದಿಸಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ತದನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮತ್ತೆ ವೈ-ಫೈ ಆನ್ ಮಾಡಿ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ನಿಮ್ಮ ವಾಹಕದಲ್ಲಿ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಿ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ko/strings.xml b/core/res/res/values-mcc310-mnc210-ko/strings.xml new file mode 100644 index 000000000000..c2783529f9f9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ko/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 이 기능을 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"이동통신사에 등록"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi 통화"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ky-rKG/strings.xml b/core/res/res/values-mcc310-mnc210-ky-rKG/strings.xml new file mode 100644 index 000000000000..1dce9c45fb3b --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ky-rKG/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Операторуңузга катталыңыз"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi чалуу"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-lo-rLA/strings.xml b/core/res/res/values-mcc310-mnc210-lo-rLA/strings.xml new file mode 100644 index 000000000000..d54c935c446e --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-lo-rLA/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"ເພື່ອໂທ ແລະ ສົ່ງຂໍ້ຄວາມຜ່ານ Wi-Fi, ໃຫ້ແຈ້ງຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານເພື່ອຕັ້ງບໍລິການນີ້ກ່ອນ. ຈາກນັ້ນ ເປີດການໂທ Wi-Fi ອີກເທື່ອໜຶ່ງຈາກການຕັ້ງຄ່າ."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ລົງທະບຽນນໍາຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"ການໂທ %s Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-lt/strings.xml b/core/res/res/values-mcc310-mnc210-lt/strings.xml new file mode 100644 index 000000000000..a8c2a5665c2b --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-lt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Jei norite skambinti ir siųsti pranešimus naudodami „Wi-Fi“, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite „Wi-Fi“ skambinimą Nustatymų skiltyje."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Užregistruokite pas operatorių"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"„%s“ „Wi-Fi“ skambinimas"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-lv/strings.xml b/core/res/res/values-mcc310-mnc210-lv/strings.xml new file mode 100644 index 000000000000..566a4f199839 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-lv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoram iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Reģistrējieties pie sava mobilo sakaru operatora."</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi zvani"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-mk-rMK/strings.xml b/core/res/res/values-mcc310-mnc210-mk-rMK/strings.xml new file mode 100644 index 000000000000..f47bbde90cf5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-mk-rMK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"За повикување и испраќање пораки преку Wi-Fi, прво побарајте од операторот да ви ја постави оваа услуга. Потоа повторно вклучете Повици преку Wi-Fi во Поставки."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Регистрирајте се кај операторот"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Повици преку Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ml-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-ml-rIN/strings.xml new file mode 100644 index 000000000000..20bf1eb6c722 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ml-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"വൈഫൈ വഴി കോളുകൾ വിളിക്കാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"നിങ്ങളുടെ കാരിയറിൽ രജിസ്റ്റർ ചെയ്യുക"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s വൈഫൈ കോളിംഗ്"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-mn-rMN/strings.xml b/core/res/res/values-mcc310-mnc210-mn-rMN/strings.xml new file mode 100644 index 000000000000..32e7c1121a1f --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-mn-rMN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi дуудлага хийх болон зурвас илгээх бол эхлээд оператор компаниасаа энэ төхөөрөмжийг тохируулахыг хүснэ үү. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаана уу."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Оператор компанидаа бүртгүүлэх"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi Дуудлага"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-mr-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-mr-rIN/strings.xml new file mode 100644 index 000000000000..1d2958552f85 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-mr-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठविण्यासाठी, प्रथम आपल्या वाहकास ही सेवा सेट करण्यास सांगा. नंतर सेटिंग्जमधून पुन्हा वाय-फाय कॉलिंग चालू करा."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"आपल्या वाहकासह नोंदणी करा"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s वाय-फाय कॉलिंग"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ms-rMY/strings.xml b/core/res/res/values-mcc310-mnc210-ms-rMY/strings.xml new file mode 100644 index 000000000000..961f9cf7f30f --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ms-rMY/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, mula-mula minta pembawa anda menyediakan perkhidmatan ini. Kemudian, hidupkan panggilan Wi-Fi sekali lagi daripada Tetapan."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Daftar dengan pembawa anda"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Panggilan Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-my-rMM/strings.xml b/core/res/res/values-mcc310-mnc210-my-rMM/strings.xml new file mode 100644 index 000000000000..078d196148d1 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-my-rMM/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"ဝိုင်ဖိုင်ကိုအသုံးပြု၍ ဖုန်းခေါ်ဆိုရန်နှင့် စာပို့ရန်၊ ဤစက်ပစ္စည်းကို တပ်ဆင်ရန် သင့်အသုံးပြုသည့်မိုဘိုင်းဝန်ဆောင်မှုအား ဦးစွာမေးပါ။ ထို့နောက် ဆက်တင်များထဲမှ ဝိုင်ဖိုင်ခေါ်ဆိုမှုကို ဖွင့်ပါ။"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"သင့်အသုံးပြုသည့်မိုဘိုင်းဝန်ဆောင်မှုဖြင့် မှတ်ပုံတင်ရန်"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-nb/strings.xml b/core/res/res/values-mcc310-mnc210-nb/strings.xml new file mode 100644 index 000000000000..36adfa2d6dcc --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-nb/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Du må be operatøren din om å konfigurere denne tjenesten før du kan ringe og sende meldinger via Wi-Fi. Deretter slår du på Wi-Fi-anrop igjen fra innstillingene."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrer deg hos operatøren din"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi-anrop"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ne-rNP/strings.xml b/core/res/res/values-mcc310-mnc210-ne-rNP/strings.xml new file mode 100644 index 000000000000..9a66faa084f5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ne-rNP/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi मार्फत कल गर्न र सन्देशहरू पठाउन, सबभन्दा पहिला यो सेवा सेटअप गर्न तपाईँको वाहकलाई भन्नुहोस्। त्यसपछि फेरि सेटिङहरूबाट Wi-Fi कलिङ सक्रिय पार्नुहोस्।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"आफ्नो वाहकसँगै दर्ता गर्नुहोस्"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi कलिङ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-nl/strings.xml b/core/res/res/values-mcc310-mnc210-nl/strings.xml new file mode 100644 index 000000000000..d90df1267167 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-nl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registreren bij je provider"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Bellen via wifi van %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-pa-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-pa-rIN/strings.xml new file mode 100644 index 000000000000..39bdd6405934 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-pa-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi \'ਤੇ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਹ ਸੇਵਾ ਸੈੱਟ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਤੋਂ Wi-Fi ਕਾਲਿੰਗ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ।"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਰਜਿਸਟਰ ਕਰੋ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi ਕਾਲਿੰਗ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-pl/strings.xml b/core/res/res/values-mcc310-mnc210-pl/strings.xml new file mode 100644 index 000000000000..f6865cfaee56 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-pl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Zarejestruj u operatora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Połączenia przez Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-pt-rBR/strings.xml b/core/res/res/values-mcc310-mnc210-pt-rBR/strings.xml new file mode 100644 index 000000000000..90561a22f637 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-pt-rBR/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-pt-rPT/strings.xml b/core/res/res/values-mcc310-mnc210-pt-rPT/strings.xml new file mode 100644 index 000000000000..c5ee6d391c82 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-pt-rPT/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar o serviço. Em seguida, nas Definições, ative novamente as Chamadas Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registar-se junto do seu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Chamadas Wi-Fi da %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-pt/strings.xml b/core/res/res/values-mcc310-mnc210-pt/strings.xml new file mode 100644 index 000000000000..90561a22f637 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-pt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ro/strings.xml b/core/res/res/values-mcc310-mnc210-ro/strings.xml new file mode 100644 index 000000000000..90a59c0aa9c7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ro/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Pentru a apela și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Înregistrați-vă la operatorul dvs."</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Apelare prin Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ru/strings.xml b/core/res/res/values-mcc310-mnc210-ru/strings.xml new file mode 100644 index 000000000000..18cd9e0a406a --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ru/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо сначала обратиться к оператору связи и подключить эту услугу. После этого вы сможете снова выбрать этот параметр в настройках."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Укажите оператора и зарегистрируйтесь"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Звонки по Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-si-rLK/strings.xml b/core/res/res/values-mcc310-mnc210-si-rLK/strings.xml new file mode 100644 index 000000000000..bc4e9ee7c1c4 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-si-rLK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ඔබගේ වාහකය සමඟ ලියාපදිංචි වන්න"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi අමතමින්"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sk/strings.xml b/core/res/res/values-mcc310-mnc210-sk/strings.xml new file mode 100644 index 000000000000..7fe4d5ea2c67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrujte sa so svojím operátorom"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Volanie cez Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sl/strings.xml b/core/res/res/values-mcc310-mnc210-sl/strings.xml new file mode 100644 index 000000000000..f1938a74bcc6 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registracija pri operaterju"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Klicanje prek omrežja Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sq-rAL/strings.xml b/core/res/res/values-mcc310-mnc210-sq-rAL/strings.xml new file mode 100644 index 000000000000..bcaa4a26ac18 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sq-rAL/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Për të bërë telefonata dhe për të dërguar mesazhe me Wi-Fi, në fillim kërkoji operatorit celular ta konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi, nga Cilësimet."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Regjistrohu me operatorin tënd celular"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Telefonatat me Wi-Fi nga %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sr/strings.xml b/core/res/res/values-mcc310-mnc210-sr/strings.xml new file mode 100644 index 000000000000..324e5c9d1374 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Региструјте се код мобилног оператера"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Wi-Fi позивање преко оператера %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sv/strings.xml b/core/res/res/values-mcc310-mnc210-sv/strings.xml new file mode 100644 index 000000000000..bd329f322728 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Registrera dig hos operatören"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi-samtal"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-sw/strings.xml b/core/res/res/values-mcc310-mnc210-sw/strings.xml new file mode 100644 index 000000000000..616c3bd87477 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-sw/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako asanidi huduma hii kwanza. Kisha uwashe tena upigaji simu kwa Wi-Fi kutoka kwenye Mipangilio."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Jisajili na mtoa huduma wako"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Upigaji Simu kwa Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ta-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-ta-rIN/strings.xml new file mode 100644 index 000000000000..411b8ef135fb --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ta-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"வைஃபை மூலம் அழைக்க மற்றும் செய்திகள் அனுப்ப, முதலில் மொபைல் நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும்."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"உங்கள் மொபைல் நிறுவனத்தில் பதிவுசெய்யவும்"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s வைஃபை அழைப்பு"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-te-rIN/strings.xml b/core/res/res/values-mcc310-mnc210-te-rIN/strings.xml new file mode 100644 index 000000000000..d3141d8540c0 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-te-rIN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fiలో కాల్లు చేయడానికి మరియు సందేశాలు పంపడానికి, ముందుగా ఈ సేవను సెటప్ చేయమని మీ క్యారియర్ను అడగండి. ఆపై సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ను మళ్లీ ఆన్ చేయండి."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"మీ క్యారియర్తో నమోదు చేయండి"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi కాలింగ్"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-th/strings.xml b/core/res/res/values-mcc310-mnc210-th/strings.xml new file mode 100644 index 000000000000..a7929ee1d23f --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-th/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"ลงทะเบียนกับผู้ให้บริการ"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"การโทรผ่าน Wi-Fi ของ %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-tl/strings.xml b/core/res/res/values-mcc310-mnc210-tl/strings.xml new file mode 100644 index 000000000000..2598e22370f2 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-tl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Upang tumawag at magpadala ng mga mensahe sa pamamagitan ng Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay muling i-on ang pagtawag sa Wi-Fi mula sa Mga Setting."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Magparehistro sa iyong carrier"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Pagtawag Gamit ang Wi-Fi ng %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-tr/strings.xml b/core/res/res/values-mcc310-mnc210-tr/strings.xml new file mode 100644 index 000000000000..1da0b1fc1a09 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-tr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Kablosuz ağ üzerinden telefon etmek ve ileti göndermek için ilk önce operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra, Ayarlar\'dan Kablosuz çağrı özelliğini tekrar açın."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Operatörünüze kaydolun"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Kablosuz Çağrı"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-uk/strings.xml b/core/res/res/values-mcc310-mnc210-uk/strings.xml new file mode 100644 index 000000000000..37b445dbce3c --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-uk/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спершу попросіть свого оператора налаштувати цю послугу. Після цього ввімкніть дзвінки через Wi-Fi у налаштуваннях."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Зареєструйтеся в оператора"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Дзвінок через Wi-Fi від оператора %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-ur-rPK/strings.xml b/core/res/res/values-mcc310-mnc210-ur-rPK/strings.xml new file mode 100644 index 000000000000..150a0bd406bb --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-ur-rPK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کیلئے، پہلے اپنے کیریئر سے اس سروس کو سیٹ اپ کرنے کیلئے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"اپنے کیریئر کے ساتھ رجسٹر کریں"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi کالنگ"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-uz-rUZ/strings.xml b/core/res/res/values-mcc310-mnc210-uz-rUZ/strings.xml new file mode 100644 index 000000000000..6e9b7e0755ca --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-uz-rUZ/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Mobil operatoringiz yordamida ro‘yxatdan o‘ting"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi qo‘ng‘iroqlar"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-vi/strings.xml b/core/res/res/values-mcc310-mnc210-vi/strings.xml new file mode 100644 index 000000000000..302c51dc3b44 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-vi/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Đăng ký với nhà cung cấp dịch vụ của bạn"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"Gọi điện qua Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-zh-rCN/strings.xml b/core/res/res/values-mcc310-mnc210-zh-rCN/strings.xml new file mode 100644 index 000000000000..356223919576 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-zh-rCN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"向您的运营商注册"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s WLAN 通话功能"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-zh-rHK/strings.xml b/core/res/res/values-mcc310-mnc210-zh-rHK/strings.xml new file mode 100644 index 000000000000..f890edf224e7 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-zh-rHK/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"如要透過 Wi-Fi 撥打電話和傳送訊息,請先向流動網絡供應商要求設定此服務,然後再次在「設定」中開啟 [Wi-Fi 通話]。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"向您的流動網絡供應商註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-zh-rTW/strings.xml b/core/res/res/values-mcc310-mnc210-zh-rTW/strings.xml new file mode 100644 index 000000000000..13ef81686cfd --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-zh-rTW/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"如要透過 Wi-Fi 撥打電話及傳送訊息,請先要求您的行動通訊業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"向您的行動通訊業者註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc210-zu/strings.xml b/core/res/res/values-mcc310-mnc210-zu/strings.xml new file mode 100644 index 000000000000..cde0a8c73820 --- /dev/null +++ b/core/res/res/values-mcc310-mnc210-zu/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="5217754856196352581">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-Fi, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le divayisi. Bese uvula ukushaya kwe-Wi-Fi futhi kusukela kuzilungiselelo."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="4688475512286389971">"Bhalisa ngenkampani yakho yenethiwekhi"</item> + </string-array> + <string name="wfcSpnFormat" msgid="5475635312889002673">"%s ukushaya kwe-Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-ar/strings.xml b/core/res/res/values-mcc310-mnc220-ar/strings.xml new file mode 100644 index 000000000000..229c9ce6be67 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-ar/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذه الخدمة، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"التسجيل لدى مشغّل شبكة الجوّال"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s جارٍ الاتصال عبر Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-cs/strings.xml b/core/res/res/values-mcc310-mnc220-cs/strings.xml new file mode 100644 index 000000000000..776c1838616b --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-cs/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Chcete-li volat a odesílat textové zprávy přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registrace u operátora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Volání přes Wi-Fi: %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-da/strings.xml b/core/res/res/values-mcc310-mnc220-da/strings.xml new file mode 100644 index 000000000000..de6b1240d9cb --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-da/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Før du kan foretage opkald og sende beskeder via Wi-Fi, skal du anmode dit mobilselskab om at konfigurere denne tjeneste. Du skal derefter slå Wi-Fi-opkald til igen fra Indstillinger."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registrer dig hos dit mobilselskab"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Wi-Fi-opkald"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-de/strings.xml b/core/res/res/values-mcc310-mnc220-de/strings.xml new file mode 100644 index 000000000000..b7cdd3889fed --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-de/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registriere dich bei deinem Mobilfunkanbieter"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s-WLAN-Anrufe"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-el/strings.xml b/core/res/res/values-mcc310-mnc220-el/strings.xml new file mode 100644 index 000000000000..940e23dbb85b --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-el/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά τη λειτουργία Κλήσης Wi-Fi από τις Ρυθμίσεις."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Κλήση Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-es-rUS/strings.xml b/core/res/res/values-mcc310-mnc220-es-rUS/strings.xml new file mode 100644 index 000000000000..6df96d820d3b --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-es-rUS/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Para realizar llamadas y enviar mensajes con Wi-Fi, primero solicítale al proveedor que instale el servicio. Luego, vuelve a activar Llamada con Wi-Fi en Configuración."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Regístrate con tu proveedor"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Llamada con Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-es/strings.xml b/core/res/res/values-mcc310-mnc220-es/strings.xml new file mode 100644 index 000000000000..5292afee270e --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-es/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Para hacer llamadas y enviar mensajes por Wi-Fi, solicita a tu operador que configure este servicio y, cuando lo haga, vuelve a activar las llamadas por Wi-Fi en Ajustes."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Regístrate con tu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Llamada por Wi-Fi de %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-fr/strings.xml b/core/res/res/values-mcc310-mnc220-fr/strings.xml new file mode 100644 index 000000000000..dec321e8b55b --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-fr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Inscrivez-vous auprès de votre opérateur."</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Appels Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-it/strings.xml b/core/res/res/values-mcc310-mnc220-it/strings.xml new file mode 100644 index 000000000000..04bfca3815cd --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-it/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Per poter effettuare chiamate e inviare messaggi tramite Wi-Fi, devi chiedere all\'operatore di attivare il servizio. Dopodiché, riattiva le chiamate Wi-Fi dalle Impostazioni."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registrati con il tuo operatore"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Chiamate Wi-Fi %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-ja/strings.xml b/core/res/res/values-mcc310-mnc220-ja/strings.xml new file mode 100644 index 000000000000..71956ecb6650 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-ja/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 発信を再度 ON にしてください。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"携帯通信会社に登録してください"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Wi-Fi 通話(%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-ko/strings.xml b/core/res/res/values-mcc310-mnc220-ko/strings.xml new file mode 100644 index 000000000000..40d08656b9d8 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-ko/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 이 기능을 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"이동통신사에 등록"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Wi-Fi 통화"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-nb/strings.xml b/core/res/res/values-mcc310-mnc220-nb/strings.xml new file mode 100644 index 000000000000..798bb7d5bb8f --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-nb/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Du må be operatøren din om å konfigurere denne tjenesten før du kan ringe og sende meldinger via Wi-Fi. Deretter slår du på Wi-Fi-anrop igjen fra innstillingene."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registrer deg hos operatøren din"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Wi-Fi-anrop"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-nl/strings.xml b/core/res/res/values-mcc310-mnc220-nl/strings.xml new file mode 100644 index 000000000000..ed37e20e5020 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-nl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registreren bij je provider"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Bellen via wifi van %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-pl/strings.xml b/core/res/res/values-mcc310-mnc220-pl/strings.xml new file mode 100644 index 000000000000..077c4267e56a --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-pl/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Zarejestruj u operatora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Połączenia przez Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-pt-rPT/strings.xml b/core/res/res/values-mcc310-mnc220-pt-rPT/strings.xml new file mode 100644 index 000000000000..20799a7fd499 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-pt-rPT/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar o serviço. Em seguida, nas Definições, ative novamente as Chamadas Wi-Fi."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registar-se junto do seu operador"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Chamadas Wi-Fi da %s"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-pt/strings.xml b/core/res/res/values-mcc310-mnc220-pt/strings.xml new file mode 100644 index 000000000000..3a322818d70a --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-pt/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente as chamadas por Wi-Fi nas configurações."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Faça registro na sua operadora"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s chamada Wi-Fi"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-ru/strings.xml b/core/res/res/values-mcc310-mnc220-ru/strings.xml new file mode 100644 index 000000000000..46a8d6f8118a --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-ru/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо сначала обратиться к оператору связи и подключить эту услугу. После этого вы сможете снова выбрать этот параметр в настройках."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Укажите оператора и зарегистрируйтесь"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"Звонки по Wi-Fi (%s)"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-sv/strings.xml b/core/res/res/values-mcc310-mnc220-sv/strings.xml new file mode 100644 index 000000000000..056824dfd89b --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-sv/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Registrera dig hos operatören"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Wi-Fi-samtal"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-tr/strings.xml b/core/res/res/values-mcc310-mnc220-tr/strings.xml new file mode 100644 index 000000000000..47aa7b7648ed --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-tr/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"Kablosuz ağ üzerinden telefon etmek ve ileti göndermek için ilk önce operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra, Ayarlar\'dan Kablosuz çağrı özelliğini tekrar açın."</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"Operatörünüze kaydolun"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Kablosuz Çağrı"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-zh-rCN/strings.xml b/core/res/res/values-mcc310-mnc220-zh-rCN/strings.xml new file mode 100644 index 000000000000..a64a3b57d1a9 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-zh-rCN/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"向您的运营商注册"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s WLAN 通话功能"</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc220-zh-rTW/strings.xml b/core/res/res/values-mcc310-mnc220-zh-rTW/strings.xml new file mode 100644 index 000000000000..1673efc441f3 --- /dev/null +++ b/core/res/res/values-mcc310-mnc220-zh-rTW/strings.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2016, 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcOperatorErrorAlertMessages"> + <item msgid="6238990105876016549">"如要透過 Wi-Fi 撥打電話及傳送訊息,請先要求您的行動通訊業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item> + </string-array> + <string-array name="wfcOperatorErrorNotificationMessages"> + <item msgid="2866631708941520085">"向您的行動通訊業者註冊"</item> + </string-array> + <string name="wfcSpnFormat" msgid="3422704506272221128">"%s Wi-Fi 通話"</string> +</resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index b9d86617b1de..be8577ae9b65 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4430,7 +4430,9 @@ i inside of its frozen icicle in addition to meta-data such as the current cursor position. By default this is disabled; it can be useful when the contents of a text view is not stored - in a persistent place such as a content provider. --> + in a persistent place such as a content provider. For + {@link android.widget.EditText} it is always enabled, regardless + of the value of the attribute. --> <attr name="freezesText" format="boolean" /> <!-- If set, causes words that are longer than the view is wide to be ellipsized instead of broken in the middle. diff --git a/core/tests/coretests/res/layout/animator_set_squares.xml b/core/tests/coretests/res/layout/animator_set_squares.xml index 23e6eea06a2b..6888248f5b13 100644 --- a/core/tests/coretests/res/layout/animator_set_squares.xml +++ b/core/tests/coretests/res/layout/animator_set_squares.xml @@ -4,7 +4,8 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" - android:orientation="horizontal"> + android:orientation="horizontal" + android:id="@+id/container"> <View android:layout_width="50dp" android:layout_height="50dp" diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java new file mode 100644 index 000000000000..dc6042311095 --- /dev/null +++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2016 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.transition; + +import android.animation.AnimatorSetActivity; +import android.app.Activity; +import android.test.ActivityInstrumentationTestCase2; +import android.test.suitebuilder.annotation.SmallTest; +import android.transition.Transition.TransitionListener; +import android.transition.Transition.TransitionListenerAdapter; +import android.view.View; +import android.view.ViewGroup; + +import com.android.frameworks.coretests.R; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static android.support.test.espresso.Espresso.onView; + +public class FadeTransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { + Activity mActivity; + public FadeTransitionTest() { + super(AnimatorSetActivity.class); + } + + @Override + protected void setUp() throws Exception { + mActivity = getActivity(); + } + + @SmallTest + public void testFadeOutAndIn() throws Throwable { + View square1 = mActivity.findViewById(R.id.square1); + Fade fadeOut = new Fade(Fade.MODE_OUT); + TransitionLatch latch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE); + assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS)); + assertEquals(View.VISIBLE, square1.getVisibility()); + Thread.sleep(100); + assertFalse(square1.getTransitionAlpha() == 0 || square1.getTransitionAlpha() == 1); + assertTrue(latch.endLatch.await(400, TimeUnit.MILLISECONDS)); + assertEquals(1.0f, square1.getTransitionAlpha()); + assertEquals(View.INVISIBLE, square1.getVisibility()); + + Fade fadeIn = new Fade(Fade.MODE_IN); + latch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE); + assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS)); + assertEquals(View.VISIBLE, square1.getVisibility()); + Thread.sleep(100); + final float transitionAlpha = square1.getTransitionAlpha(); + assertTrue("expecting transitionAlpha to be between 0 and 1. Was " + transitionAlpha, + transitionAlpha > 0 && transitionAlpha < 1); + assertTrue(latch.endLatch.await(400, TimeUnit.MILLISECONDS)); + assertEquals(1.0f, square1.getTransitionAlpha()); + assertEquals(View.VISIBLE, square1.getVisibility()); + } + + @SmallTest + public void testFadeOutInterrupt() throws Throwable { + View square1 = mActivity.findViewById(R.id.square1); + Fade fadeOut = new Fade(Fade.MODE_OUT); + FadeValueCheck fadeOutValueCheck = new FadeValueCheck(square1); + fadeOut.addListener(fadeOutValueCheck); + TransitionLatch outLatch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE); + assertTrue(outLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); + Thread.sleep(100); + + Fade fadeIn = new Fade(Fade.MODE_IN); + FadeValueCheck fadeInValueCheck = new FadeValueCheck(square1); + fadeIn.addListener(fadeInValueCheck); + TransitionLatch inLatch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE); + assertTrue(inLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); + + assertEquals(fadeOutValueCheck.pauseTransitionAlpha, fadeInValueCheck.startTransitionAlpha); + assertTrue("expecting transitionAlpha to be between 0 and 1. Was " + + fadeOutValueCheck.pauseTransitionAlpha, + fadeOutValueCheck.pauseTransitionAlpha > 0 && + fadeOutValueCheck.pauseTransitionAlpha < 1); + + assertTrue(inLatch.endLatch.await(400, TimeUnit.MILLISECONDS)); + assertEquals(1.0f, square1.getTransitionAlpha()); + assertEquals(View.VISIBLE, square1.getVisibility()); + } + + @SmallTest + public void testFadeInInterrupt() throws Throwable { + final View square1 = mActivity.findViewById(R.id.square1); + runTestOnUiThread(new Runnable() { + @Override + public void run() { + square1.setVisibility(View.INVISIBLE); + } + }); + Fade fadeIn = new Fade(Fade.MODE_IN); + FadeValueCheck fadeInValueCheck = new FadeValueCheck(square1); + fadeIn.addListener(fadeInValueCheck); + TransitionLatch inLatch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE); + assertTrue(inLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); + Thread.sleep(100); + + Fade fadeOut = new Fade(Fade.MODE_OUT); + FadeValueCheck fadeOutValueCheck = new FadeValueCheck(square1); + fadeOut.addListener(fadeOutValueCheck); + TransitionLatch outLatch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE); + assertTrue(outLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); + + assertEquals(fadeOutValueCheck.pauseTransitionAlpha, fadeInValueCheck.startTransitionAlpha); + assertTrue("expecting transitionAlpha to be between 0 and 1. Was " + + fadeInValueCheck.pauseTransitionAlpha, + fadeInValueCheck.pauseTransitionAlpha > 0 && + fadeInValueCheck.pauseTransitionAlpha < 1); + + assertTrue(outLatch.endLatch.await(400, TimeUnit.MILLISECONDS)); + assertEquals(1.0f, square1.getTransitionAlpha()); + assertEquals(View.INVISIBLE, square1.getVisibility()); + } + + public TransitionLatch setVisibilityInTransition(final Transition transition, int viewId, + final int visibility) throws Throwable { + final ViewGroup sceneRoot = (ViewGroup) mActivity.findViewById(R.id.container); + final View view = sceneRoot.findViewById(viewId); + TransitionLatch latch = new TransitionLatch(); + transition.addListener(latch); + runTestOnUiThread(new Runnable() { + @Override + public void run() { + TransitionManager.beginDelayedTransition(sceneRoot, transition); + view.setVisibility(visibility); + } + }); + return latch; + } + + public static class TransitionLatch implements TransitionListener { + public CountDownLatch startLatch = new CountDownLatch(1); + public CountDownLatch endLatch = new CountDownLatch(1); + public CountDownLatch cancelLatch = new CountDownLatch(1); + public CountDownLatch pauseLatch = new CountDownLatch(1); + public CountDownLatch resumeLatch = new CountDownLatch(1); + + @Override + public void onTransitionStart(Transition transition) { + startLatch.countDown(); + } + + @Override + public void onTransitionEnd(Transition transition) { + endLatch.countDown(); + transition.removeListener(this); + } + + @Override + public void onTransitionCancel(Transition transition) { + cancelLatch.countDown(); + } + + @Override + public void onTransitionPause(Transition transition) { + pauseLatch.countDown(); + } + + @Override + public void onTransitionResume(Transition transition) { + resumeLatch.countDown(); + } + } + + private static class FadeValueCheck extends TransitionListenerAdapter { + public float startTransitionAlpha; + public float pauseTransitionAlpha; + private final View mView; + + public FadeValueCheck(View view) { + mView = view; + } + @Override + public void onTransitionStart(Transition transition) { + startTransitionAlpha = mView.getTransitionAlpha(); + } + + @Override + public void onTransitionPause(Transition transition) { + pauseTransitionAlpha = mView.getTransitionAlpha(); + } + } +} diff --git a/core/tests/coretests/src/android/widget/EditorCursorTest.java b/core/tests/coretests/src/android/widget/EditorCursorTest.java new file mode 100644 index 000000000000..04c8b8cacb42 --- /dev/null +++ b/core/tests/coretests/src/android/widget/EditorCursorTest.java @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2016 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 android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.test.ActivityInstrumentationTestCase2; +import android.test.suitebuilder.annotation.SmallTest; +import android.view.ViewGroup; + +public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewActivity> { + + private EditText mEditText; + private final String RTL_STRING = "مرحبا الروبوت مرحبا الروبوت مرحبا الروبوت"; + + public EditorCursorTest() { + super(TextViewActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + mEditText = new EditText(getActivity()); + mEditText.setTextSize(30); + mEditText.setSingleLine(true); + mEditText.setLines(1); + mEditText.setPadding(15, 15, 15, 15); + ViewGroup.LayoutParams editTextLayoutParams = new ViewGroup.LayoutParams(200, + ViewGroup.LayoutParams.WRAP_CONTENT); + + mEditText.setLayoutParams(editTextLayoutParams); + + final FrameLayout layout = new FrameLayout(getActivity()); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + layout.setLayoutParams(layoutParams); + layout.addView(mEditText); + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + getActivity().setContentView(layout); + mEditText.requestFocus(); + } + }); + getInstrumentation().waitForIdleSync(); + } + + @SmallTest + public void testCursorIsInViewBoundariesWhenOnRightForLtr() throws Exception { + // Asserts that when an EditText has LTR text, and cursor is at the end (right), + // cursor is drawn to the right edge of the view + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + mEditText.setText("aaaaaaaaaaaaaaaaaaaaaa"); + int length = mEditText.getText().length(); + mEditText.setSelection(length, length); + } + }); + getInstrumentation().waitForIdleSync(); + + Editor editor = mEditText.getEditorForTesting(); + Drawable drawable = editor.getCursorDrawable()[0]; + Rect drawableBounds = drawable.getBounds(); + Rect drawablePadding = new Rect(); + drawable.getPadding(drawablePadding); + + // right edge of the view including the scroll + int maxRight = mEditText.getWidth() - mEditText.getCompoundPaddingRight() + - mEditText.getCompoundPaddingLeft() + +mEditText.getScrollX(); + int diff = drawableBounds.right - drawablePadding.right - maxRight; + assertTrue(diff >= 0 && diff <= 1); + } + + @SmallTest + public void testCursorIsInViewBoundariesWhenOnLeftForLtr() throws Exception { + // Asserts that when an EditText has LTR text, and cursor is at the beginning, + // cursor is drawn to the left edge of the view + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + mEditText.setText("aaaaaaaaaaaaaaaaaaaaaa"); + mEditText.setSelection(0, 0); + } + }); + getInstrumentation().waitForIdleSync(); + + Drawable drawable = mEditText.getEditorForTesting().getCursorDrawable()[0]; + Rect drawableBounds = drawable.getBounds(); + Rect drawablePadding = new Rect(); + drawable.getPadding(drawablePadding); + + int diff = drawableBounds.left + drawablePadding.left; + assertTrue(diff >= 0 && diff <= 1); + } + + @SmallTest + public void testCursorIsInViewBoundariesWhenOnRightForRtl() throws Exception { + // Asserts that when an EditText has RTL text, and cursor is at the end, + // cursor is drawn to the left edge of the view + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + mEditText.setText(RTL_STRING); + mEditText.setSelection(0, 0); + } + }); + getInstrumentation().waitForIdleSync(); + + Drawable drawable = mEditText.getEditorForTesting().getCursorDrawable()[0]; + Rect drawableBounds = drawable.getBounds(); + Rect drawablePadding = new Rect(); + drawable.getPadding(drawablePadding); + + int maxRight = mEditText.getWidth() - mEditText.getCompoundPaddingRight() + - mEditText.getCompoundPaddingLeft() + mEditText.getScrollX(); + + int diff = drawableBounds.right - drawablePadding.right - maxRight; + assertTrue(diff >= 0 && diff <= 1); + } + + @SmallTest + public void testCursorIsInViewBoundariesWhenOnLeftForRtl() throws Exception { + // Asserts that when an EditText has RTL text, and cursor is at the beginning, + // cursor is drawn to the right edge of the view + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + mEditText.setText(RTL_STRING); + int length = mEditText.getText().length(); + mEditText.setSelection(length, length); + } + }); + getInstrumentation().waitForIdleSync(); + + Drawable drawable = mEditText.getEditorForTesting().getCursorDrawable()[0]; + Rect drawableBounds = drawable.getBounds(); + Rect drawablePadding = new Rect(); + drawable.getPadding(drawablePadding); + + int diff = drawableBounds.left - mEditText.getScrollX() + drawablePadding.left; + assertTrue(diff >= 0 && diff <= 1); + } + +} diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 7b43947bc1e0..1f242a36e80e 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -317,11 +317,14 @@ LOCAL_SRC_FILES += \ tests/microbench/DisplayListCanvasBench.cpp \ tests/microbench/LinearAllocatorBench.cpp \ tests/microbench/PathParserBench.cpp \ - tests/microbench/ShadowBench.cpp + tests/microbench/ShadowBench.cpp \ + tests/microbench/TaskManagerBench.cpp ifeq (true, $(HWUI_NEW_OPS)) LOCAL_SRC_FILES += \ tests/microbench/FrameBuilderBench.cpp endif +LOCAL_CLANG := true # workaround gcc bug + include $(BUILD_EXECUTABLE) diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp index e3a5f3eeeac1..f83e1faf9c8a 100644 --- a/libs/hwui/BakedOpDispatcher.cpp +++ b/libs/hwui/BakedOpDispatcher.cpp @@ -201,8 +201,7 @@ static void renderTextShadow(BakedOpRenderer& renderer, FontRenderer& fontRender renderer.caches().dropShadowCache.setFontRenderer(fontRenderer); ShadowTexture* texture = renderer.caches().dropShadowCache.get( - op.paint, (const char*) op.glyphs, - op.glyphCount, textShadow.radius, op.positions); + op.paint, op.glyphs, op.glyphCount, textShadow.radius, op.positions); // If the drop shadow exceeds the max texture size or couldn't be // allocated, skip drawing if (!texture) return; @@ -277,8 +276,7 @@ static void renderTextOp(BakedOpRenderer& renderer, const TextOp& op, const Bake bool forceFinish = (renderType == TextRenderType::Flush); bool mustDirtyRenderTarget = renderer.offscreenRenderTarget(); const Rect* localOpClip = pureTranslate ? &state.computedState.clipRect() : nullptr; - fontRenderer.renderPosText(op.paint, localOpClip, - (const char*) op.glyphs, op.glyphCount, x, y, + fontRenderer.renderPosText(op.paint, localOpClip, op.glyphs, op.glyphCount, x, y, op.positions, mustDirtyRenderTarget ? &layerBounds : nullptr, &functor, forceFinish); if (mustDirtyRenderTarget) { @@ -701,8 +699,7 @@ void BakedOpDispatcher::onTextOnPathOp(BakedOpRenderer& renderer, const TextOnPa bool mustDirtyRenderTarget = renderer.offscreenRenderTarget(); const Rect localSpaceClip = state.computedState.computeLocalSpaceClip(); - if (fontRenderer.renderTextOnPath(op.paint, &localSpaceClip, - reinterpret_cast<const char*>(op.glyphs), op.glyphCount, + if (fontRenderer.renderTextOnPath(op.paint, &localSpaceClip, op.glyphs, op.glyphCount, op.path, op.hOffset, op.vOffset, mustDirtyRenderTarget ? &layerBounds : nullptr, &functor)) { if (mustDirtyRenderTarget) { diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp index 3db14b55cff6..00560d7df454 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -428,7 +428,7 @@ void DisplayListCanvas::drawTextOnPath(const uint16_t* glyphs, int count, if (!glyphs || count <= 0) return; int bytesCount = 2 * count; - DrawOp* op = new (alloc()) DrawTextOnPathOp(refText((const char*) glyphs, bytesCount), + DrawOp* op = new (alloc()) DrawTextOnPathOp(refBuffer<glyph_t>(glyphs, count), bytesCount, count, refPath(&path), hOffset, vOffset, refPaint(&paint)); addDrawOp(op); @@ -442,11 +442,10 @@ void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, if (!glyphs || count <= 0 || PaintUtils::paintWillNotDrawText(paint)) return; int bytesCount = count * 2; - const char* text = refText((const char*) glyphs, bytesCount); positions = refBuffer<float>(positions, count * 2); Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); - DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, + DrawOp* op = new (alloc()) DrawTextOp(refBuffer<glyph_t>(glyphs, count), bytesCount, count, x, y, positions, refPaint(&paint), totalAdvance, bounds); addDrawOp(op); drawTextDecorations(x, y, totalAdvance, paint); diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 06e72a06eaca..e5711e35a88b 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -256,10 +256,6 @@ private: return dstBuffer; } - inline char* refText(const char* text, size_t byteLength) { - return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); - } - inline const SkPath* refPath(const SkPath* path) { if (!path) return nullptr; diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index 92217edc2f16..20501ba3c1d9 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -1229,7 +1229,7 @@ public: class DrawSomeTextOp : public DrawOp { public: - DrawSomeTextOp(const char* text, int bytesCount, int count, const SkPaint* paint) + DrawSomeTextOp(const glyph_t* text, int bytesCount, int count, const SkPaint* paint) : DrawOp(paint), mText(text), mBytesCount(bytesCount), mCount(count) {}; virtual void output(int level, uint32_t logFlags) const override { @@ -1251,14 +1251,14 @@ public: } protected: - const char* mText; + const glyph_t* mText; int mBytesCount; int mCount; }; class DrawTextOnPathOp : public DrawSomeTextOp { public: - DrawTextOnPathOp(const char* text, int bytesCount, int count, + DrawTextOnPathOp(const glyph_t* text, int bytesCount, int count, const SkPath* path, float hOffset, float vOffset, const SkPaint* paint) : DrawSomeTextOp(text, bytesCount, count, paint), mPath(path), mHOffset(hOffset), mVOffset(vOffset) { @@ -1280,7 +1280,7 @@ private: class DrawTextOp : public DrawStrokableOp { public: - DrawTextOp(const char* text, int bytesCount, int count, float x, float y, + DrawTextOp(const glyph_t* text, int bytesCount, int count, float x, float y, const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds) : DrawStrokableOp(bounds, paint), mText(text), mBytesCount(bytesCount), mCount(count), mX(x), mY(y), mPositions(positions), mTotalAdvance(totalAdvance) { @@ -1341,7 +1341,7 @@ public: virtual const char* name() override { return "DrawText"; } private: - const char* mText; + const glyph_t* mText; int mBytesCount; int mCount; float mX; diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 68bae6dc47f6..1b618c6a71c6 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -557,7 +557,7 @@ void FontRenderer::setFont(const SkPaint* paint, const SkMatrix& matrix) { mCurrentFont = Font::create(this, paint, matrix); } -FontRenderer::DropShadow FontRenderer::renderDropShadow(const SkPaint* paint, const char *text, +FontRenderer::DropShadow FontRenderer::renderDropShadow(const SkPaint* paint, const glyph_t *glyphs, int numGlyphs, float radius, const float* positions) { checkInit(); @@ -577,7 +577,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(const SkPaint* paint, co mBounds = nullptr; Rect bounds; - mCurrentFont->measure(paint, text, numGlyphs, &bounds, positions); + mCurrentFont->measure(paint, glyphs, numGlyphs, &bounds, positions); uint32_t intRadius = Blur::convertRadiusToInt(radius); uint32_t paddedWidth = (uint32_t) (bounds.right - bounds.left) + 2 * intRadius; @@ -609,7 +609,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(const SkPaint* paint, co // text has non-whitespace, so draw and blur to create the shadow // NOTE: bounds.isEmpty() can't be used here, since vertical coordinates are inverted // TODO: don't draw pure whitespace in the first place, and avoid needing this check - mCurrentFont->render(paint, text, numGlyphs, penX, penY, + mCurrentFont->render(paint, glyphs, numGlyphs, penX, penY, Font::BITMAP, dataBuffer, paddedWidth, paddedHeight, nullptr, positions); // Unbind any PBO we might have used @@ -643,17 +643,17 @@ void FontRenderer::finishRender() { issueDrawCommand(); } -void FontRenderer::precache(const SkPaint* paint, const char* text, int numGlyphs, +void FontRenderer::precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkMatrix& matrix) { Font* font = Font::create(this, paint, matrix); - font->precache(paint, text, numGlyphs); + font->precache(paint, glyphs, numGlyphs); } void FontRenderer::endPrecaching() { checkTextureUpdate(); } -bool FontRenderer::renderPosText(const SkPaint* paint, const Rect* clip, const char *text, +bool FontRenderer::renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs, int numGlyphs, int x, int y, const float* positions, Rect* bounds, TextDrawFunctor* functor, bool forceFinish) { if (!mCurrentFont) { @@ -662,7 +662,7 @@ bool FontRenderer::renderPosText(const SkPaint* paint, const Rect* clip, const c } initRender(clip, bounds, functor); - mCurrentFont->render(paint, text, numGlyphs, x, y, positions); + mCurrentFont->render(paint, glyphs, numGlyphs, x, y, positions); if (forceFinish) { finishRender(); @@ -671,7 +671,7 @@ bool FontRenderer::renderPosText(const SkPaint* paint, const Rect* clip, const c return mDrawn; } -bool FontRenderer::renderTextOnPath(const SkPaint* paint, const Rect* clip, const char *text, +bool FontRenderer::renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs, int numGlyphs, const SkPath* path, float hOffset, float vOffset, Rect* bounds, TextDrawFunctor* functor) { if (!mCurrentFont) { @@ -680,7 +680,7 @@ bool FontRenderer::renderTextOnPath(const SkPaint* paint, const Rect* clip, cons } initRender(clip, bounds, functor); - mCurrentFont->render(paint, text, numGlyphs, path, hOffset, vOffset); + mCurrentFont->render(paint, glyphs, numGlyphs, path, hOffset, vOffset); finishRender(); return mDrawn; diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index 99944985cda8..e10a81b8ccd8 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -104,14 +104,14 @@ public: void setFont(const SkPaint* paint, const SkMatrix& matrix); - void precache(const SkPaint* paint, const char* text, int numGlyphs, const SkMatrix& matrix); + void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkMatrix& matrix); void endPrecaching(); - bool renderPosText(const SkPaint* paint, const Rect* clip, const char *text, + bool renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs, int numGlyphs, int x, int y, const float* positions, Rect* outBounds, TextDrawFunctor* functor, bool forceFinish = true); - bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const char *text, + bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs, int numGlyphs, const SkPath* path, float hOffset, float vOffset, Rect* outBounds, TextDrawFunctor* functor); @@ -125,7 +125,7 @@ public: // After renderDropShadow returns, the called owns the memory in DropShadow.image // and is responsible for releasing it when it's done with it - DropShadow renderDropShadow(const SkPaint* paint, const char *text, int numGlyphs, + DropShadow renderDropShadow(const SkPaint* paint, const glyph_t *glyphs, int numGlyphs, float radius, const float* positions); void setTextureFiltering(bool linearFiltering) { diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 587be92b4cbc..b7a5923cdd65 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1949,7 +1949,7 @@ void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, } } -void OpenGLRenderer::drawTextShadow(const SkPaint* paint, const char* text, +void OpenGLRenderer::drawTextShadow(const SkPaint* paint, const glyph_t* glyphs, int count, const float* positions, FontRenderer& fontRenderer, int alpha, float x, float y) { mCaches.textureState().activateTexture(0); @@ -1963,7 +1963,7 @@ void OpenGLRenderer::drawTextShadow(const SkPaint* paint, const char* text, // if shader-based correction is enabled mCaches.dropShadowCache.setFontRenderer(fontRenderer); ShadowTexture* texture = mCaches.dropShadowCache.get( - paint, text, count, textShadow.radius, positions); + paint, glyphs, count, textShadow.radius, positions); // If the drop shadow exceeds the max texture size or couldn't be // allocated, skip drawing if (!texture) return; @@ -2084,14 +2084,14 @@ void OpenGLRenderer::setProjectionPathMask(LinearAllocator& allocator, const SkP mState.setProjectionPathMask(allocator, path); } -void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, float x, float y, +void OpenGLRenderer::drawText(const glyph_t* glyphs, int bytesCount, int count, float x, float y, const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, DrawOpMode drawOpMode) { if (drawOpMode == DrawOpMode::kImmediate) { // The checks for corner-case ignorable text and quick rejection is only done for immediate // drawing as ops from DeferredDisplayList are already filtered for these - if (text == nullptr || count == 0 || mState.currentlyIgnored() || canSkipText(paint) || + if (glyphs == nullptr || count == 0 || mState.currentlyIgnored() || canSkipText(paint) || quickRejectSetupScissor(bounds)) { return; } @@ -2115,7 +2115,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, float if (CC_UNLIKELY(PaintUtils::hasTextShadow(paint))) { fontRenderer.setFont(paint, SkMatrix::I()); - drawTextShadow(paint, text, count, positions, fontRenderer, + drawTextShadow(paint, glyphs, count, positions, fontRenderer, alpha, oldX, oldY); } @@ -2156,10 +2156,10 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, float if (CC_UNLIKELY(paint->getTextAlign() != SkPaint::kLeft_Align)) { SkPaint paintCopy(*paint); paintCopy.setTextAlign(SkPaint::kLeft_Align); - status = fontRenderer.renderPosText(&paintCopy, clip, text, count, x, y, + status = fontRenderer.renderPosText(&paintCopy, clip, glyphs, count, x, y, positions, hasActiveLayer ? &layerBounds : nullptr, &functor, forceFinish); } else { - status = fontRenderer.renderPosText(paint, clip, text, count, x, y, + status = fontRenderer.renderPosText(paint, clip, glyphs, count, x, y, positions, hasActiveLayer ? &layerBounds : nullptr, &functor, forceFinish); } @@ -2173,9 +2173,9 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, float mDirty = true; } -void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, +void OpenGLRenderer::drawTextOnPath(const glyph_t* glyphs, int bytesCount, int count, const SkPath* path, float hOffset, float vOffset, const SkPaint* paint) { - if (text == nullptr || count == 0 || mState.currentlyIgnored() || canSkipText(paint)) { + if (glyphs == nullptr || count == 0 || mState.currentlyIgnored() || canSkipText(paint)) { return; } @@ -2198,7 +2198,7 @@ void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, const Rect* clip = &writableSnapshot()->getLocalClip(); Rect bounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f); - if (fontRenderer.renderTextOnPath(paint, clip, text, count, path, + if (fontRenderer.renderTextOnPath(paint, clip, glyphs, count, path, hOffset, vOffset, hasLayer() ? &bounds : nullptr, &functor)) { dirtyLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, *currentTransform()); mDirty = true; diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 84bc9b059d33..dacd8ccaa6ea 100755 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -191,9 +191,9 @@ public: void drawPath(const SkPath* path, const SkPaint* paint); void drawLines(const float* points, int count, const SkPaint* paint); void drawPoints(const float* points, int count, const SkPaint* paint); - void drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, + void drawTextOnPath(const glyph_t* glyphs, int bytesCount, int count, const SkPath* path, float hOffset, float vOffset, const SkPaint* paint); - void drawText(const char* text, int bytesCount, int count, float x, float y, + void drawText(const glyph_t* glyphs, int bytesCount, int count, float x, float y, const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, DrawOpMode drawOpMode = DrawOpMode::kImmediate); void drawRects(const float* rects, int count, const SkPaint* paint); @@ -647,7 +647,7 @@ private: * @param x The x coordinate where the shadow will be drawn * @param y The y coordinate where the shadow will be drawn */ - void drawTextShadow(const SkPaint* paint, const char* text, int count, + void drawTextShadow(const SkPaint* paint, const glyph_t* glyphs, int count, const float* positions, FontRenderer& fontRenderer, int alpha, float x, float y); diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 3e111516ac63..249b5b07fa11 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -31,9 +31,6 @@ namespace uirenderer { // Compile-time properties /////////////////////////////////////////////////////////////////////////////// -// If turned on, text is interpreted as glyphs instead of UTF-16 -#define RENDER_TEXT_AS_GLYPHS 1 - // Textures used by layers must have dimensions multiples of this number #define LAYER_SIZE 64 diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp index fe4b3d7507b2..e1f0b2a20172 100644 --- a/libs/hwui/TextDropShadowCache.cpp +++ b/libs/hwui/TextDropShadowCache.cpp @@ -37,9 +37,9 @@ hash_t ShadowText::hash() const { hash = JenkinsHashMix(hash, flags); hash = JenkinsHashMix(hash, android::hash_type(italicStyle)); hash = JenkinsHashMix(hash, android::hash_type(scaleX)); - if (text) { + if (glyphs) { hash = JenkinsHashMixShorts( - hash, reinterpret_cast<const uint16_t*>(text), glyphCount); + hash, reinterpret_cast<const uint16_t*>(glyphs), glyphCount); } if (positions) { for (uint32_t i = 0; i < glyphCount * 2; i++) { @@ -71,11 +71,11 @@ int ShadowText::compare(const ShadowText& lhs, const ShadowText& rhs) { if (lhs.scaleX < rhs.scaleX) return -1; if (lhs.scaleX > rhs.scaleX) return +1; - if (lhs.text != rhs.text) { - if (!lhs.text) return -1; - if (!rhs.text) return +1; + if (lhs.glyphs != rhs.glyphs) { + if (!lhs.glyphs) return -1; + if (!rhs.glyphs) return +1; - deltaInt = memcmp(lhs.text, rhs.text, lhs.glyphCount * sizeof(glyph_t)); + deltaInt = memcmp(lhs.glyphs, rhs.glyphs, lhs.glyphCount * sizeof(glyph_t)); if (deltaInt != 0) return deltaInt; } @@ -145,7 +145,7 @@ void TextDropShadowCache::clear() { mCache.clear(); } -ShadowTexture* TextDropShadowCache::get(const SkPaint* paint, const char* glyphs, int numGlyphs, +ShadowTexture* TextDropShadowCache::get(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, float radius, const float* positions) { ShadowText entry(paint, radius, numGlyphs, glyphs, positions); ShadowTexture* texture = mCache.get(entry); diff --git a/libs/hwui/TextDropShadowCache.h b/libs/hwui/TextDropShadowCache.h index cf647882e5a7..d536c40756ff 100644 --- a/libs/hwui/TextDropShadowCache.h +++ b/libs/hwui/TextDropShadowCache.h @@ -35,26 +35,21 @@ class FontRenderer; struct ShadowText { ShadowText(): glyphCount(0), radius(0.0f), textSize(0.0f), typeface(nullptr), - flags(0), italicStyle(0.0f), scaleX(0), text(nullptr), positions(nullptr) { + flags(0), italicStyle(0.0f), scaleX(0), glyphs(nullptr), positions(nullptr) { } // len is the number of bytes in text - ShadowText(const SkPaint* paint, float radius, uint32_t glyphCount, const char* srcText, - const float* positions): - glyphCount(glyphCount), radius(radius), positions(positions) { - // TODO: Propagate this through the API, we should not cast here - text = (const char16_t*) srcText; - - textSize = paint->getTextSize(); - typeface = paint->getTypeface(); - - flags = 0; - if (paint->isFakeBoldText()) { - flags |= Font::kFakeBold; - } - - italicStyle = paint->getTextSkewX(); - scaleX = paint->getTextScaleX(); + ShadowText(const SkPaint* paint, float radius, uint32_t glyphCount, const glyph_t* srcGlyphs, + const float* positions) + : glyphCount(glyphCount) + , radius(radius) + , textSize(paint->getTextSize()) + , typeface(paint->getTypeface()) + , flags(paint->isFakeBoldText() ? Font::kFakeBold : 0) + , italicStyle(paint->getTextSkewX()) + , scaleX(paint->getTextScaleX()) + , glyphs(srcGlyphs) + , positions(positions) { } ~ShadowText() { @@ -73,8 +68,8 @@ struct ShadowText { } void copyTextLocally() { - str.setTo((const char16_t*) text, glyphCount); - text = str.string(); + str.setTo(reinterpret_cast<const char16_t*>(glyphs), glyphCount); + glyphs = reinterpret_cast<const glyph_t*>(str.string()); if (positions != nullptr) { positionsCopy.clear(); positionsCopy.appendArray(positions, glyphCount * 2); @@ -89,7 +84,7 @@ struct ShadowText { uint32_t flags; float italicStyle; float scaleX; - const char16_t* text; + const glyph_t* glyphs; const float* positions; // Not directly used to compute the cache key @@ -135,7 +130,7 @@ public: */ void operator()(ShadowText& text, ShadowTexture*& texture) override; - ShadowTexture* get(const SkPaint* paint, const char* text, + ShadowTexture* get(const SkPaint* paint, const glyph_t* text, int numGlyphs, float radius, const float* positions); /** diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp index dc82041e8f89..9a825fdec601 100644 --- a/libs/hwui/font/Font.cpp +++ b/libs/hwui/font/Font.cpp @@ -291,15 +291,15 @@ CachedGlyphInfo* Font::getCachedGlyph(const SkPaint* paint, glyph_t textUnit, bo return cachedGlyph; } -void Font::render(const SkPaint* paint, const char *text, +void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y, const float* positions) { - render(paint, text, numGlyphs, x, y, FRAMEBUFFER, nullptr, + render(paint, glyphs, numGlyphs, x, y, FRAMEBUFFER, nullptr, 0, 0, nullptr, positions); } -void Font::render(const SkPaint* paint, const char *text, int numGlyphs, +void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkPath* path, float hOffset, float vOffset) { - if (numGlyphs == 0 || text == nullptr) { + if (numGlyphs == 0 || glyphs == nullptr) { return; } @@ -315,7 +315,7 @@ void Font::render(const SkPaint* paint, const char *text, int numGlyphs, float pathLength = SkScalarToFloat(measure.getLength()); if (paint->getTextAlign() != SkPaint::kLeft_Align) { - float textWidth = SkScalarToFloat(paint->measureText(text, numGlyphs * 2)); + float textWidth = SkScalarToFloat(paint->measureText(glyphs, numGlyphs * 2)); float pathOffset = pathLength; if (paint->getTextAlign() == SkPaint::kCenter_Align) { textWidth *= 0.5f; @@ -325,7 +325,7 @@ void Font::render(const SkPaint* paint, const char *text, int numGlyphs, } while (glyphsCount < numGlyphs && penX < pathLength) { - glyph_t glyph = GET_GLYPH(text); + glyph_t glyph = *(glyphs++); if (IS_END_OF_STRING(glyph)) { break; @@ -345,26 +345,26 @@ void Font::render(const SkPaint* paint, const char *text, int numGlyphs, } } -void Font::measure(const SkPaint* paint, const char* text, +void Font::measure(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, Rect *bounds, const float* positions) { if (bounds == nullptr) { ALOGE("No return rectangle provided to measure text"); return; } bounds->set(1e6, -1e6, -1e6, 1e6); - render(paint, text, numGlyphs, 0, 0, MEASURE, nullptr, 0, 0, bounds, positions); + render(paint, glyphs, numGlyphs, 0, 0, MEASURE, nullptr, 0, 0, bounds, positions); } -void Font::precache(const SkPaint* paint, const char* text, int numGlyphs) { +void Font::precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs) { ATRACE_NAME("Precache Glyphs"); - if (numGlyphs == 0 || text == nullptr) { + if (numGlyphs == 0 || glyphs == nullptr) { return; } int glyphsCount = 0; while (glyphsCount < numGlyphs) { - glyph_t glyph = GET_GLYPH(text); + glyph_t glyph = *(glyphs++); // Reached the end of the string if (IS_END_OF_STRING(glyph)) { @@ -376,10 +376,10 @@ void Font::precache(const SkPaint* paint, const char* text, int numGlyphs) { } } -void Font::render(const SkPaint* paint, const char* text, +void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, Rect* bounds, const float* positions) { - if (numGlyphs == 0 || text == nullptr) { + if (numGlyphs == 0 || glyphs == nullptr) { return; } @@ -396,7 +396,7 @@ void Font::render(const SkPaint* paint, const char* text, int glyphsCount = 0; while (glyphsCount < numGlyphs) { - glyph_t glyph = GET_GLYPH(text); + glyph_t glyph = *(glyphs++); // Reached the end of the string if (IS_END_OF_STRING(glyph)) { diff --git a/libs/hwui/font/Font.h b/libs/hwui/font/Font.h index 59518a1fb8ee..e8882d9f4bda 100644 --- a/libs/hwui/font/Font.h +++ b/libs/hwui/font/Font.h @@ -82,10 +82,10 @@ public: ~Font(); - void render(const SkPaint* paint, const char* text, + void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y, const float* positions); - void render(const SkPaint* paint, const char* text, + void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkPath* path, float hOffset, float vOffset); const Font::FontDescription& getDescription() const { @@ -111,13 +111,13 @@ private: MEASURE, }; - void precache(const SkPaint* paint, const char* text, int numGlyphs); + void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs); - void render(const SkPaint* paint, const char *text, + void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); - void measure(const SkPaint* paint, const char* text, + void measure(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, Rect *bounds, const float* positions); void invalidateTextureCache(CacheTexture* cacheTexture = nullptr); diff --git a/libs/hwui/font/FontUtil.h b/libs/hwui/font/FontUtil.h index 4e5debe33c4a..aa77d98c9343 100644 --- a/libs/hwui/font/FontUtil.h +++ b/libs/hwui/font/FontUtil.h @@ -40,26 +40,9 @@ #define CACHE_BLOCK_ROUNDING_SIZE 4 -#if RENDER_TEXT_AS_GLYPHS - typedef uint16_t glyph_t; - #define TO_GLYPH(g) g - #define GET_METRICS(cache, glyph) cache->getGlyphIDMetrics(glyph) - #define GET_GLYPH(text) nextGlyph((const uint16_t**) &text) - #define IS_END_OF_STRING(glyph) false - - static inline glyph_t nextGlyph(const uint16_t** srcPtr) { - const uint16_t* src = *srcPtr; - glyph_t g = *src++; - *srcPtr = src; - return g; - } -#else - typedef SkUnichar glyph_t; - #define TO_GLYPH(g) ((SkUnichar) g) - #define GET_METRICS(cache, glyph) cache->getUnicharMetrics(glyph) - #define GET_GLYPH(text) SkUTF16_NextUnichar((const uint16_t**) &text) - #define IS_END_OF_STRING(glyph) glyph < 0 -#endif +typedef uint16_t glyph_t; +#define GET_METRICS(cache, glyph) cache->getGlyphIDMetrics(glyph) +#define IS_END_OF_STRING(glyph) false #define AUTO_KERN(prev, next) (((next) - (prev) + 32) >> 6 << 16) diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp index 5ed7aa464026..3440d03b4fc5 100644 --- a/libs/hwui/tests/common/TestUtils.cpp +++ b/libs/hwui/tests/common/TestUtils.cpp @@ -58,27 +58,22 @@ sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater( return layerUpdater; } -void TestUtils::drawTextToCanvas(TestCanvas* canvas, const char* text, - const SkPaint& paint, float x, float y) { - // drawing text requires GlyphID TextEncoding (which JNI layer would have done) - LOG_ALWAYS_FATAL_IF(paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding, - "must use glyph encoding"); +void TestUtils::layoutTextUnscaled(const SkPaint& paint, const char* text, + std::vector<glyph_t>* outGlyphs, std::vector<float>* outPositions, + float* outTotalAdvance, Rect* outBounds) { + Rect bounds; + float totalAdvance = 0; SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry); SkAutoGlyphCacheNoGamma autoCache(paint, &surfaceProps, &SkMatrix::I()); - - float totalAdvance = 0; - std::vector<glyph_t> glyphs; - std::vector<float> positions; - Rect bounds; while (*text != '\0') { SkUnichar unichar = SkUTF8_NextUnichar(&text); glyph_t glyph = autoCache.getCache()->unicharToGlyph(unichar); autoCache.getCache()->unicharToGlyph(unichar); // push glyph and its relative position - glyphs.push_back(glyph); - positions.push_back(totalAdvance); - positions.push_back(0); + outGlyphs->push_back(glyph); + outPositions->push_back(totalAdvance); + outPositions->push_back(0); // compute bounds SkGlyph skGlyph = autoCache.getCache()->getUnicharMetrics(unichar); @@ -91,6 +86,23 @@ void TestUtils::drawTextToCanvas(TestCanvas* canvas, const char* text, paint.getTextWidths(&glyph, sizeof(glyph), &skWidth, NULL); totalAdvance += skWidth; } + *outBounds = bounds; + *outTotalAdvance = totalAdvance; +} + +void TestUtils::drawTextToCanvas(TestCanvas* canvas, const char* text, + const SkPaint& paint, float x, float y) { + // drawing text requires GlyphID TextEncoding (which JNI layer would have done) + LOG_ALWAYS_FATAL_IF(paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding, + "must use glyph encoding"); + SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry); + SkAutoGlyphCacheNoGamma autoCache(paint, &surfaceProps, &SkMatrix::I()); + + std::vector<glyph_t> glyphs; + std::vector<float> positions; + float totalAdvance; + Rect bounds; + layoutTextUnscaled(paint, text, &glyphs, &positions, &totalAdvance, &bounds); // apply alignment via x parameter (which JNI layer would have done) if (paint.getTextAlign() == SkPaint::kCenter_Align) { diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h index ae0814241055..6f237059dd33 100644 --- a/libs/hwui/tests/common/TestUtils.h +++ b/libs/hwui/tests/common/TestUtils.h @@ -205,6 +205,10 @@ public: static SkColor interpolateColor(float fraction, SkColor start, SkColor end); + static void layoutTextUnscaled(const SkPaint& paint, const char* text, + std::vector<glyph_t>* outGlyphs, std::vector<float>* outPositions, + float* outTotalAdvance, Rect* outBounds); + static void drawTextToCanvas(TestCanvas* canvas, const char* text, const SkPaint& paint, float x, float y); diff --git a/libs/hwui/tests/microbench/TaskManagerBench.cpp b/libs/hwui/tests/microbench/TaskManagerBench.cpp new file mode 100644 index 000000000000..0ea30e4757fb --- /dev/null +++ b/libs/hwui/tests/microbench/TaskManagerBench.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 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. + */ + +#include <benchmark/Benchmark.h> + +#include "thread/Task.h" +#include "thread/TaskManager.h" +#include "thread/TaskProcessor.h" +#include "tests/microbench/MicroBench.h" + +#include <vector> + +using namespace android; +using namespace android::uirenderer; + +class TrivialTask : public Task<char> {}; + +class TrivialProcessor : public TaskProcessor<char> { +public: + TrivialProcessor(TaskManager* manager) + : TaskProcessor(manager) {} + virtual ~TrivialProcessor() {} + virtual void onProcess(const sp<Task<char> >& task) override { + TrivialTask* t = static_cast<TrivialTask*>(task.get()); + t->setResult(reinterpret_cast<intptr_t>(t) % 16 == 0 ? 'a' : 'b'); + } +}; + +BENCHMARK_NO_ARG(BM_TaskManager_allocateTask); +void BM_TaskManager_allocateTask::Run(int iters) { + std::vector<sp<TrivialTask> > tasks; + tasks.reserve(iters); + + StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + tasks.emplace_back(new TrivialTask); + MicroBench::DoNotOptimize(tasks.back()); + } + StopBenchmarkTiming(); +} + +BENCHMARK_NO_ARG(BM_TaskManager_enqueueTask); +void BM_TaskManager_enqueueTask::Run(int iters) { + TaskManager taskManager; + sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager)); + std::vector<sp<TrivialTask> > tasks; + tasks.reserve(iters); + + StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + tasks.emplace_back(new TrivialTask); + MicroBench::DoNotOptimize(tasks.back()); + processor->add(tasks.back()); + } + StopBenchmarkTiming(); + + for (sp<TrivialTask>& task : tasks) { + task->getResult(); + } +} + +BENCHMARK_NO_ARG(BM_TaskManager_enqueueRunDeleteTask); +void BM_TaskManager_enqueueRunDeleteTask::Run(int iters) { + TaskManager taskManager; + sp<TrivialProcessor> processor(new TrivialProcessor(&taskManager)); + std::vector<sp<TrivialTask> > tasks; + tasks.reserve(iters); + + StartBenchmarkTiming(); + for (int i = 0; i < iters; i++) { + tasks.emplace_back(new TrivialTask); + MicroBench::DoNotOptimize(tasks.back()); + processor->add(tasks.back()); + } + for (sp<TrivialTask>& task : tasks) { + MicroBench::DoNotOptimize(task->getResult()); + } + tasks.clear(); + StopBenchmarkTiming(); +} diff --git a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp b/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp index c54f2c365ee2..0d26df203f02 100644 --- a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp +++ b/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp @@ -21,29 +21,31 @@ #include "utils/Blur.h" #include "tests/common/TestUtils.h" -#include <SkBlurDrawLooper.h> #include <SkPaint.h> using namespace android; using namespace android::uirenderer; RENDERTHREAD_TEST(TextDropShadowCache, addRemove) { + SkPaint paint; + paint.setTextSize(20); + GammaFontRenderer gammaFontRenderer; FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer(); - TextDropShadowCache cache(5000); + fontRenderer.setFont(&paint, SkMatrix::I()); + TextDropShadowCache cache(MB(5)); cache.setFontRenderer(fontRenderer); - SkPaint paint; - paint.setLooper(SkBlurDrawLooper::Create((SkColor)0xFFFFFFFF, - Blur::convertRadiusToSigma(10), 10, 10))->unref(); - std::string msg("This is a test"); - std::unique_ptr<float[]> positions(new float[msg.length()]); - for (size_t i = 0; i < msg.length(); i++) { - positions[i] = i * 10.0f; - } - fontRenderer.setFont(&paint, SkMatrix::I()); - ShadowTexture* texture = cache.get(&paint, msg.c_str(), msg.length(), - 10.0f, positions.get()); + std::vector<glyph_t> glyphs; + std::vector<float> positions; + float totalAdvance; + uirenderer::Rect bounds; + TestUtils::layoutTextUnscaled(paint, "This is a test", + &glyphs, &positions, &totalAdvance, &bounds); + EXPECT_TRUE(bounds.contains(5, -10, 100, 0)) << "Expect input to be nontrivially sized"; + + ShadowTexture* texture = cache.get(&paint, glyphs.data(), glyphs.size(), 10, positions.data()); + ASSERT_TRUE(texture); ASSERT_FALSE(texture->cleanup); ASSERT_EQ((uint32_t) texture->objectSize(), cache.getSize()); diff --git a/libs/hwui/thread/TaskManager.cpp b/libs/hwui/thread/TaskManager.cpp index a07845ecf659..d346b859526e 100644 --- a/libs/hwui/thread/TaskManager.cpp +++ b/libs/hwui/thread/TaskManager.cpp @@ -103,7 +103,7 @@ bool TaskManager::WorkerThread::threadLoop() { return true; } -bool TaskManager::WorkerThread::addTask(TaskWrapper task) { +bool TaskManager::WorkerThread::addTask(const TaskWrapper& task) { if (!isRunning()) { run(mName.string(), PRIORITY_DEFAULT); } else if (exitPending()) { diff --git a/libs/hwui/thread/TaskManager.h b/libs/hwui/thread/TaskManager.h index d0eb3049ae37..e4808f7b7181 100644 --- a/libs/hwui/thread/TaskManager.h +++ b/libs/hwui/thread/TaskManager.h @@ -80,7 +80,7 @@ private: public: WorkerThread(const String8 name): mSignal(Condition::WAKE_UP_ONE), mName(name) { } - bool addTask(TaskWrapper task); + bool addTask(const TaskWrapper& task); size_t getTaskCount() const; void exit(); diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index c194711f7fa0..a3bbdfcb2627 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -19,6 +19,7 @@ package android.media; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -242,6 +243,7 @@ public final class AudioAttributes implements Parcelable { private int mFlags = 0x0; private HashSet<String> mTags; private String mFormattedTags; + private Bundle mBundle; // lazy-initialized, may be null private AudioAttributes() { } @@ -295,6 +297,20 @@ public final class AudioAttributes implements Parcelable { /** * @hide + * Return the Bundle of data. + * @return a copy of the Bundle for this instance, may be null. + */ + @SystemApi + public Bundle getBundle() { + if (mBundle == null) { + return mBundle; + } else { + return new Bundle(mBundle); + } + } + + /** + * @hide * Return the set of tags. * @return a read-only set of all tags stored as strings. */ @@ -327,6 +343,7 @@ public final class AudioAttributes implements Parcelable { private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID; private int mFlags = 0x0; private HashSet<String> mTags = new HashSet<String>(); + private Bundle mBundle; /** * Constructs a new Builder with the defaults. @@ -365,6 +382,9 @@ public final class AudioAttributes implements Parcelable { aa.mFlags = mFlags; aa.mTags = (HashSet<String>) mTags.clone(); aa.mFormattedTags = TextUtils.join(";", mTags); + if (mBundle != null) { + aa.mBundle = new Bundle(mBundle); + } return aa; } @@ -453,6 +473,25 @@ public final class AudioAttributes implements Parcelable { /** * @hide + * Adds a Bundle of data + * @param bundle a non-null Bundle + * @return the same builder instance + */ + @SystemApi + public Builder addBundle(@NonNull Bundle bundle) { + if (bundle == null) { + throw new IllegalArgumentException("Illegal null bundle"); + } + if (mBundle == null) { + mBundle = new Bundle(bundle); + } else { + mBundle.putAll(bundle); + } + return this; + } + + /** + * @hide * Add a custom tag stored as a string * @param tag * @return the same Builder instance. @@ -584,6 +623,10 @@ public final class AudioAttributes implements Parcelable { * see definition of kAudioAttributesMarshallTagFlattenTags */ public final static int FLATTEN_TAGS = 0x1; + + private final static int ATTR_PARCEL_IS_NULL_BUNDLE = -1977; + private final static int ATTR_PARCEL_IS_VALID_BUNDLE = 1980; + /** * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG) */ @@ -602,6 +645,12 @@ public final class AudioAttributes implements Parcelable { } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) { dest.writeString(mFormattedTags); } + if (mBundle == null) { + dest.writeInt(ATTR_PARCEL_IS_NULL_BUNDLE); + } else { + dest.writeInt(ATTR_PARCEL_IS_VALID_BUNDLE); + dest.writeBundle(mBundle); + } } private AudioAttributes(Parcel in) { @@ -621,6 +670,16 @@ public final class AudioAttributes implements Parcelable { } mFormattedTags = TextUtils.join(";", mTags); } + switch (in.readInt()) { + case ATTR_PARCEL_IS_NULL_BUNDLE: + mBundle = null; + break; + case ATTR_PARCEL_IS_VALID_BUNDLE: + mBundle = new Bundle(in.readBundle()); + break; + default: + Log.e(TAG, "Illegal value unmarshalling AudioAttributes, can't initialize bundle"); + } } public static final Parcelable.Creator<AudioAttributes> CREATOR @@ -655,7 +714,7 @@ public final class AudioAttributes implements Parcelable { @Override public int hashCode() { - return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags); + return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags, mBundle); } @Override @@ -664,7 +723,8 @@ public final class AudioAttributes implements Parcelable { + " usage=" + mUsage + " content=" + mContentType + " flags=0x" + Integer.toHexString(mFlags).toUpperCase() - + " tags=" + mFormattedTags); + + " tags=" + mFormattedTags + + " bundle=" + (mBundle == null ? "null" : mBundle.toString())); } /** @hide */ diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index d18933385463..12a220f2974f 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -88,7 +88,7 @@ interface ITvInputManager { // For the recording session void connect(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId); - void startRecording(in IBinder sessionToken, int userId); + void startRecording(in IBinder sessionToken, in Uri programHint, int userId); void stopRecording(in IBinder sessionToken, int userId); // For TV input hardware binding diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl index 408a76277845..07781bc0a042 100644 --- a/media/java/android/media/tv/ITvInputSession.aidl +++ b/media/java/android/media/tv/ITvInputSession.aidl @@ -58,6 +58,6 @@ oneway interface ITvInputSession { // For the recording session void connect(in Uri channelUri, in Bundle params); void disconnect(); - void startRecording(); + void startRecording(in Uri programHint); void stopRecording(); } diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 4ac58766ca94..b15acef583b0 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.Nullable; import android.content.Context; import android.graphics.Rect; import android.media.PlaybackParams; @@ -220,7 +221,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand break; } case DO_START_RECORDING: { - mTvInputRecordingSessionImpl.startRecording(); + mTvInputRecordingSessionImpl.startRecording((Uri) msg.obj); break; } case DO_STOP_RECORDING: { @@ -366,8 +367,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand } @Override - public void startRecording() { - mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_START_RECORDING)); + public void startRecording(@Nullable Uri programHint) { + mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_START_RECORDING, programHint)); } @Override diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 1cd19589cb94..d76408e3a9d3 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -2039,22 +2039,25 @@ public final class TvInputManager { } /** - * Starts TV program recording for the current recording session. + * Starts TV program recording in the current recording session. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - void startRecording() { + void startRecording(@Nullable Uri programHint) { if (mToken == null) { Log.w(TAG, "The session has been already released"); return; } try { - mService.startRecording(mToken, mUserId); + mService.startRecording(mToken, programHint, mUserId); } catch (RemoteException e) { throw new RuntimeException(e); } } /** - * Stops TV program recording for the current recording session. + * Stops TV program recording in the current recording session. */ void stopRecording() { if (mToken == null) { diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index d48b2c8b0816..91f1ee9f7e33 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -1699,16 +1699,26 @@ public abstract class TvInputService extends Service { * Called when the application requests to start recording. Recording must start * immediately. * + * <p>The application may supply the URI for a TV program as a hint for filling in program + * specific data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. + * A non-null {@code programHint} implies the started recording should be of that specific + * program, whereas null {@code programHint} does not impose such a requirement and the + * recording can span across multiple TV programs. In either case, the application must call + * {@link TvRecordingClient#stopRecording()} to stop the recording. + * * <p>The session must call either {@link #notifyRecordingStarted()} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - public abstract void onStartRecording(); + public abstract void onStartRecording(@Nullable Uri programHint); /** * Called when the application requests to stop recording. Recording must stop immediately. * * <p>The session must call either {@link #notifyRecordingStopped(Uri)} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. */ public abstract void onStopRecording(); @@ -1744,11 +1754,11 @@ public abstract class TvInputService extends Service { } /** - * Calls {@link #onStartRecording()}. + * Calls {@link #onStartRecording(Uri)}. * */ - void startRecording() { - onStartRecording(); + void startRecording(@Nullable Uri programHint) { + onStartRecording(programHint); } /** diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index 1d80068fbdf8..b943c3d5f559 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -17,6 +17,7 @@ package android.media.tv; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.net.Uri; @@ -131,20 +132,31 @@ public class TvRecordingClient { } /** - * Starts TV program recording for the current recording session. It is expected that recording + * Starts TV program recording in the current recording session. It is expected that recording * starts immediately after calling this method. * + * <p>The application may supply the URI for a TV program as a hint to the corresponding TV + * input service for filling in program specific data fields in the + * {@link android.media.tv.TvContract.RecordedPrograms} table. A non-null {@code programHint} + * implies the started recording should be of that specific program, whereas null + * {@code programHint} does not impose such a requirement and the recording can span across + * multiple TV programs. In either case, the caller must call {@link #stopRecording()} to stop + * the recording. + * * <p>The recording session will respond by calling * {@link RecordingCallback#onRecordingStarted()} or {@link RecordingCallback#onError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be null. */ - public void startRecording() { + public void startRecording(@Nullable Uri programHint) { if (mSession != null) { - mSession.startRecording(); + mSession.startRecording(programHint); } } /** - * Stops TV program recording for the current recording session. It is expected that recording + * Stops TV program recording in the current recording session. It is expected that recording * stops immediately after calling this method. * * <p>The recording session will respond by calling @@ -325,7 +337,7 @@ public class TvRecordingClient { @Override public void onRecordingStopped(TvInputManager.Session session, Uri recordedProgramUri) { if (DEBUG) { - Log.d(TAG, "onRecordingStopped()"); + Log.d(TAG, "onRecordingStopped(recordedProgramUri= " + recordedProgramUri + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onRecordingStopped - session not created"); @@ -337,7 +349,7 @@ public class TvRecordingClient { @Override public void onError(TvInputManager.Session session, int error) { if (DEBUG) { - Log.d(TAG, "onError()"); + Log.d(TAG, "onError(error=" + error + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onError - session not created"); @@ -350,7 +362,8 @@ public class TvRecordingClient { public void onSessionEvent(TvInputManager.Session session, String eventType, Bundle eventArgs) { if (DEBUG) { - Log.d(TAG, "onSessionEvent(" + eventType + ")"); + Log.d(TAG, "onSessionEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onSessionEvent - session not created"); diff --git a/packages/DocumentsUI/res/layout/directory_cluster.xml b/packages/DocumentsUI/res/layout/directory_cluster.xml index 2fa09d39bdab..d84ef0823309 100644 --- a/packages/DocumentsUI/res/layout/directory_cluster.xml +++ b/packages/DocumentsUI/res/layout/directory_cluster.xml @@ -27,6 +27,7 @@ <FrameLayout android:id="@+id/container_directory" + android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml index 223d7290e72f..d0364ff44294 100644 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ b/packages/DocumentsUI/res/layout/fragment_directory.xml @@ -17,8 +17,10 @@ <com.android.documentsui.DirectoryView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:animateLayoutChanges="true"> + android:background="@color/window_background" + android:outlineProvider="bounds" + android:elevation="4dp" + android:orientation="vertical"> <ProgressBar android:id="@+id/progressbar" @@ -43,6 +45,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:background="@color/window_background" android:visibility="gone"> <LinearLayout @@ -81,7 +84,6 @@ <android.support.v7.widget.RecyclerView android:id="@+id/list" - android:background="@color/window_background" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 70bee3cd3c6e..d21b157cb49c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -876,17 +876,8 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi msgView.setText(msg); imageView.setImageResource(drawable); - content.animate().cancel(); // cancel any ongoing animations - - content.setAlpha(0); mEmptyView.setVisibility(View.VISIBLE); mRecView.setVisibility(View.GONE); - - // fade in the content, so it looks purdy like - content.animate() - .alpha(1f) - .setDuration(EMPTY_REVEAL_DURATION) - .setListener(null); } private void showDirectory() { diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java new file mode 100644 index 000000000000..34f11207b006 --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2016 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.documentsui; + +import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; +import static com.android.documentsui.StubProvider.ROOT_0_ID; +import static com.android.documentsui.StubProvider.ROOT_1_ID; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.ContentProviderClient; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.os.RemoteException; +import android.provider.DocumentsContract.Document; +import android.support.test.uiautomator.By; +import android.support.test.uiautomator.Configurator; +import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.UiObjectNotFoundException; +import android.support.test.uiautomator.Until; +import android.test.ActivityInstrumentationTestCase2; +import android.view.MotionEvent; + +import com.android.documentsui.model.RootInfo; + +/** + * Provides basic test environment for UI tests: + * - Launches activity + * - Creates and gives access to test root directories and test files + * - Cleans up the test environment + */ +public abstract class ActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> { + + static final int TIMEOUT = 5000; + + // Testing files. For custom ones, override initTestFiles(). + public static final String dirName1 = "Dir1"; + public static final String fileName1 = "file1.log"; + public static final String fileName2 = "file12.png"; + public static final String fileName3 = "anotherFile0.log"; + public static final String fileName4 = "poodles.text"; + public static final String fileNameNoRename = "NO_RENAMEfile.txt"; + + public UiBot bot; + public UiDevice device; + public Context context; + + public RootInfo rootDir0; + public RootInfo rootDir1; + + ContentResolver mResolver; + DocumentsProviderHelper mDocsHelper; + ContentProviderClient mClient; + + public ActivityTest(Class<T> activityClass) { + super(activityClass); + } + + @Override + public void setUp() throws Exception { + device = UiDevice.getInstance(getInstrumentation()); + // NOTE: Must be the "target" context, else security checks in content provider will fail. + context = getInstrumentation().getTargetContext(); + bot = new UiBot(device, context, TIMEOUT); + + Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); + bot.revealLauncher(); + + mResolver = context.getContentResolver(); + mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); + mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); + + rootDir0 = mDocsHelper.getRoot(ROOT_0_ID); + rootDir1 = mDocsHelper.getRoot(ROOT_1_ID); + + launchActivity(); + + bot.revealApp(); + resetStorage(); + } + + @Override + public void tearDown() throws Exception { + mClient.release(); + super.tearDown(); + } + + void launchActivity() { + final Intent intent = context.getPackageManager().getLaunchIntentForPackage( + UiBot.TARGET_PKG); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + setActivityIntent(intent); + getActivity(); // Launch the activity. + } + + void resetStorage() throws RemoteException { + mClient.call("clear", null, null); + device.waitForIdle(); + } + + void initTestFiles() throws RemoteException { + mDocsHelper.createFolder(rootDir0, dirName1); + mDocsHelper.createDocument(rootDir0, "text/plain", fileName1); + mDocsHelper.createDocument(rootDir0, "image/png", fileName2); + mDocsHelper.createDocumentWithFlags(rootDir0.documentId, "text/plain", fileNameNoRename, + Document.FLAG_SUPPORTS_WRITE); + + mDocsHelper.createDocument(rootDir1, "text/plain", fileName3); + mDocsHelper.createDocument(rootDir1, "text/plain", fileName4); + } + + void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException { + bot.assertDocumentsCount(ROOT_0_ID, 4); + bot.assertHasDocuments(fileName1, fileName2, dirName1, fileNameNoRename); + } + + void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException { + bot.assertDocumentsCount(ROOT_1_ID, 2); + bot.assertHasDocuments(fileName3, fileName4); + } +} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java index 5df4dcaf11a7..af478eafc38e 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java @@ -92,7 +92,8 @@ public class DocumentsProviderHelper { Uri uri = DocumentsContract.createDocument(mClient, parentUri, mimeType, name); return uri; } catch (RemoteException e) { - throw new RuntimeException("Couldn't create document: " + name + " with mimetype " + mimeType, e); + throw new RuntimeException("Couldn't create document: " + name + " with mimetype " + + mimeType, e); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java index 243c3577500c..737b3761bea0 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/DownloadsActivityUiTest.java @@ -38,122 +38,74 @@ import android.view.MotionEvent; import com.android.documentsui.model.RootInfo; @LargeTest -public class DownloadsActivityUiTest extends ActivityInstrumentationTestCase2<DownloadsActivity> { +public class DownloadsActivityUiTest extends ActivityTest<DownloadsActivity> { private static final int TIMEOUT = 5000; private static final String TAG = "DownloadsActivityUiTest"; private static final String TARGET_PKG = "com.android.documentsui"; private static final String LAUNCHER_PKG = "com.android.launcher"; - private UiBot mBot; - private UiDevice mDevice; - private Context mContext; - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - private RootInfo mRoot; - public DownloadsActivityUiTest() { super(DownloadsActivity.class); } - public void setUp() throws Exception { - // Initialize UiDevice instance. - Instrumentation instrumentation = getInstrumentation(); - - mDevice = UiDevice.getInstance(instrumentation); - - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = instrumentation.getTargetContext(); - mResolver = mContext.getContentResolver(); - - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - mRoot = mDocsHelper.getRoot(ROOT_0_ID); - - // Open the Downloads activity on our stub provider root. - Intent intent = new Intent(DocumentsContract.ACTION_MANAGE_ROOT); - intent.setDataAndType(mRoot.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM); + @Override + void launchActivity() { + final Intent intent = new Intent(DocumentsContract.ACTION_MANAGE_ROOT); + intent.setDataAndType(rootDir0.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); setActivityIntent(intent); - getActivity(); // Start the activity. - - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - mBot = new UiBot(mDevice, mContext, TIMEOUT); - - resetStorage(); // Just in case a test failed and tearDown didn't happen. + getActivity(); // Launch the activity. } @Override - protected void tearDown() throws Exception { - Log.d(TAG, "Resetting storage from setUp"); - resetStorage(); - mClient.release(); - - super.tearDown(); - } - - private void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - // TODO: Would be nice to have an event to wait on here. - mDevice.waitForIdle(); - } - - private void initTestFiles() throws RemoteException { - mDocsHelper.createDocument(mRoot, "text/plain", "file0.log"); - mDocsHelper.createDocument(mRoot, "image/png", "file1.png"); - mDocsHelper.createDocument(mRoot, "text/csv", "file2.csv"); + void initTestFiles() throws RemoteException { + mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); + mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); + mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); } public void testWindowTitle() throws Exception { initTestFiles(); - mBot.assertWindowTitle(ROOT_0_ID); + bot.assertWindowTitle(ROOT_0_ID); } public void testFilesListed() throws Exception { initTestFiles(); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); } public void testFilesList_LiveUpdate() throws Exception { initTestFiles(); - mDocsHelper.createDocument(mRoot, "yummers/sandwich", "Ham & Cheese.sandwich"); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); + mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); + + device.waitForIdle(); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); } public void testDeleteDocument() throws Exception { initTestFiles(); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("file1.png"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("file1.png")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("file1.png")); } public void testSupportsShare() throws Exception { initTestFiles(); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - assertNotNull(mBot.menuShare()); + bot.clickDocument("file1.png"); + device.waitForIdle(); + assertNotNull(bot.menuShare()); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java index 868dbbb39e1b..7fd24161de81 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java @@ -30,7 +30,6 @@ import android.support.test.uiautomator.By; import android.support.test.uiautomator.Configurator; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.Until; -import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.LargeTest; import android.util.Log; import android.view.MotionEvent; @@ -38,96 +37,35 @@ import android.view.MotionEvent; import com.android.documentsui.model.RootInfo; @LargeTest -public class FilesActivityUiTest extends ActivityInstrumentationTestCase2<FilesActivity> { +public class FilesActivityUiTest extends ActivityTest<FilesActivity> { private static final int TIMEOUT = 5000; private static final String TAG = "FilesActivityUiTest"; private static final String TARGET_PKG = "com.android.documentsui"; private static final String LAUNCHER_PKG = "com.android.launcher"; - private UiBot mBot; - private UiDevice mDevice; - private Context mContext; - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - private RootInfo mRoot_0; - private RootInfo mRoot_1; - public FilesActivityUiTest() { super(FilesActivity.class); } - public void setUp() throws Exception { - // Initialize UiDevice instance. - Instrumentation instrumentation = getInstrumentation(); - - mDevice = UiDevice.getInstance(instrumentation); - - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = instrumentation.getTargetContext(); - mResolver = mContext.getContentResolver(); - - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - assertNotNull("Failed to acquire ContentProviderClient.", mClient); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - // Launch app. - Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - setActivityIntent(intent); - getActivity(); // Start the activity. - - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - mBot = new UiBot(mDevice, mContext, TIMEOUT); - - resetStorage(); // Just incase a test failed and tearDown didn't happen. - } - @Override - protected void tearDown() throws Exception { - Log.d(TAG, "Resetting storage from setUp"); - resetStorage(); - mClient.release(); - - super.tearDown(); - } - - private void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - // TODO: Would be nice to have an event to wait on here. - mDevice.waitForIdle(); - } - - private void initTestFiles() throws RemoteException { - mRoot_0 = mDocsHelper.getRoot(ROOT_0_ID); - mRoot_1 = mDocsHelper.getRoot(ROOT_1_ID); - - mDocsHelper.createDocument(mRoot_0, "text/plain", "file0.log"); - mDocsHelper.createDocument(mRoot_0, "image/png", "file1.png"); - mDocsHelper.createDocument(mRoot_0, "text/csv", "file2.csv"); + public void initTestFiles() throws RemoteException { + mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); + mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); + mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); - mDocsHelper.createDocument(mRoot_1, "text/plain", "anotherFile0.log"); - mDocsHelper.createDocument(mRoot_1, "text/plain", "poodles.text"); + mDocsHelper.createDocument(rootDir1, "text/plain", "anotherFile0.log"); + mDocsHelper.createDocument(rootDir1, "text/plain", "poodles.text"); } public void testRootsListed() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); + bot.openRoot(ROOT_0_ID); // Should also have Drive, but that requires pre-configuration of devices // We omit for now. - mBot.assertHasRoots( + bot.assertHasRoots( "Images", "Videos", "Audio", @@ -140,60 +78,60 @@ public class FilesActivityUiTest extends ActivityInstrumentationTestCase2<FilesA public void testFilesListed() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); + bot.openRoot(ROOT_0_ID); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv"); } public void testLoadsHomeByDefault() throws Exception { initTestFiles(); - mDevice.waitForIdle(); - mBot.assertWindowTitle("Home"); + device.waitForIdle(); + bot.assertWindowTitle("Home"); } public void testRootClickSetsWindowTitle() throws Exception { initTestFiles(); - mBot.openRoot("Downloads"); - mBot.assertWindowTitle("Downloads"); + bot.openRoot("Downloads"); + bot.assertWindowTitle("Downloads"); } public void testFilesList_LiveUpdate() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); - mDocsHelper.createDocument(mRoot_0, "yummers/sandwich", "Ham & Cheese.sandwich"); + bot.openRoot(ROOT_0_ID); + mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); - mDevice.waitForIdle(); - mBot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); + device.waitForIdle(); + bot.assertHasDocuments("file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); } public void testDeleteDocument() throws Exception { initTestFiles(); - mBot.openRoot(ROOT_0_ID); + bot.openRoot(ROOT_0_ID); - mBot.clickDocument("file1.png"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("file1.png"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("file1.png")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("file1.png")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("file1.png")); // Now delete from another root. - mBot.openRoot(ROOT_1_ID); + bot.openRoot(ROOT_1_ID); - mBot.clickDocument("poodles.text"); - mDevice.waitForIdle(); - mBot.menuDelete().click(); + bot.clickDocument("poodles.text"); + device.waitForIdle(); + bot.menuDelete().click(); - mBot.waitForDeleteSnackbar(); - assertFalse(mBot.hasDocuments("poodles.text")); + bot.waitForDeleteSnackbar(); + assertFalse(bot.hasDocuments("poodles.text")); - mBot.waitForDeleteSnackbarGone(); - assertFalse(mBot.hasDocuments("poodles.text")); + bot.waitForDeleteSnackbarGone(); + assertFalse(bot.hasDocuments("poodles.text")); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java index 5c6254f90964..303f2d1f99c6 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java @@ -17,7 +17,6 @@ package com.android.documentsui; import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.UiTestEnvironment.TIMEOUT; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObjectNotFoundException; @@ -25,142 +24,141 @@ import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; @LargeTest -public class RenameDocumentUiTest extends InstrumentationTestCase { +public class RenameDocumentUiTest extends ActivityTest<FilesActivity> { private static final String TAG = "RenamDocumentUiTest"; private final String newName = "kitties.log"; - private UiTestEnvironment mHelper; + public RenameDocumentUiTest() { + super(FilesActivity.class); + } @Override public void setUp() throws Exception { super.setUp(); - mHelper = new UiTestEnvironment(getInstrumentation()); - mHelper.launch(); - mHelper.initTestFiles(); - mHelper.bot().openRoot(ROOT_0_ID); + initTestFiles(); + bot.openRoot(ROOT_0_ID); } public void testRenameEnabled_SingleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, true); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, true); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testNoRenameSupport_SingleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileNameNoRename); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testOneHasRenameSupport_MultipleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().selectDocument(UiTestEnvironment.fileNameNoRename); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileName1); + bot.selectDocument(fileNameNoRename); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testRenameDisabled_MultipleSelection() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().selectDocument(UiTestEnvironment.fileName2); - mHelper.bot().openOverflowMenu(); - mHelper.bot().assertMenuEnabled(R.string.menu_rename, false); + bot.selectDocument(fileName1); + bot.selectDocument(fileName2); + bot.openOverflowMenu(); + bot.assertMenuEnabled(R.string.menu_rename, false); // Dismiss more options window - mHelper.device().pressBack(); + device.pressBack(); } public void testRenameFile_OkButton() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); - mHelper.bot().dismissKeyboardIfPresent(); - - mHelper.device().waitForIdle(TIMEOUT); - mHelper.bot().findRenameDialogOkButton().click(); - mHelper.device().waitForIdle(TIMEOUT); - - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); + bot.dismissKeyboardIfPresent(); + + device.waitForIdle(TIMEOUT); + bot.findRenameDialogOkButton().click(); + device.waitForIdle(TIMEOUT); + + bot.assertDocument(fileName1, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRenameFile_Enter() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); pressEnter(); - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertDocument(fileName1, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRenameFile_Cancel() throws Exception { - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); - mHelper.bot().dismissKeyboardIfPresent(); - - mHelper.device().waitForIdle(TIMEOUT); - mHelper.bot().findRenameDialogCancelButton().click(); - mHelper.device().waitForIdle(TIMEOUT); - - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true); - mHelper.bot().assertDocument(newName, false); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); + bot.dismissKeyboardIfPresent(); + + device.waitForIdle(TIMEOUT); + bot.findRenameDialogCancelButton().click(); + device.waitForIdle(TIMEOUT); + + bot.assertDocument(fileName1, true); + bot.assertDocument(newName, false); + bot.assertDocumentsCount(4); } public void testRenameDir() throws Exception { String oldName = "Dir1"; String newName = "Dir123"; - mHelper.bot().selectDocument(oldName); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(newName); + bot.selectDocument(oldName); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(newName); pressEnter(); - mHelper.bot().assertDocument(oldName, false); - mHelper.bot().assertDocument(newName, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertDocument(oldName, false); + bot.assertDocument(newName, true); + bot.assertDocumentsCount(4); } public void testRename_NameExists() throws Exception { // Check that document with the new name exists - mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true); - mHelper.bot().selectDocument(UiTestEnvironment.fileName1); - mHelper.bot().openOverflowMenu(); - mHelper.bot().openDialog(R.string.menu_rename); - mHelper.bot().setDialogText(UiTestEnvironment.fileName2); + bot.assertDocument(fileName2, true); + bot.selectDocument(fileName1); + bot.openOverflowMenu(); + bot.openDialog(R.string.menu_rename); + bot.setDialogText(fileName2); pressEnter(); - mHelper.bot().assertSnackbar(R.string.rename_error); - mHelper.bot().assertDocument(UiTestEnvironment.fileName1, true); - mHelper.bot().assertDocument(UiTestEnvironment.fileName2, true); - mHelper.bot().assertDocumentsCount(mHelper.getDocumentsCountDir0()); + bot.assertSnackbar(R.string.rename_error); + bot.assertDocument(fileName1, true); + bot.assertDocument(fileName2, true); + bot.assertDocumentsCount(4); } private void pressEnter() { - mHelper.device().waitForIdle(TIMEOUT); - mHelper.device().pressEnter(); - mHelper.device().waitForIdle(TIMEOUT); + device.waitForIdle(TIMEOUT); + device.pressEnter(); + device.waitForIdle(TIMEOUT); } - } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java index 042ec85ad212..61da3dfc05cb 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java @@ -24,138 +24,132 @@ import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; @LargeTest -public class SearchViewUiTest extends InstrumentationTestCase { +public class SearchViewUiTest extends ActivityTest<FilesActivity> { private static final String TAG = "SearchViewUiTest"; - private UiTestEnvironment mEnv; - - @Override - public void setUp() throws Exception { - super.setUp(); - mEnv = new UiTestEnvironment(getInstrumentation()); - mEnv.launch(); - - } - - @Override - protected void tearDown() throws Exception { - mEnv.device().pressBack(); - super.tearDown(); + public SearchViewUiTest() { + super(FilesActivity.class); } public void testSearchView_ExpandsOnClick() throws Exception { - mEnv.bot().openSearchView(); - mEnv.bot().assertSearchTextFiledAndIcon(true, false); + bot.openSearchView(); + bot.assertSearchTextFiledAndIcon(true, false); } public void testSearchView_CollapsesOnBack() throws Exception { - mEnv.bot().openSearchView(); + bot.openSearchView(); - mEnv.device().pressBack(); + device.pressBack(); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearchView_ClearsTextOnBack() throws Exception { String query = "file2"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressBack(); + device.pressBack(); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearch_ResultsFound() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "file1"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); - mEnv.bot().assertSearchTextField(true, query); + bot.openSearchView(); + bot.setSearchQuery(query); + bot.assertSearchTextField(true, query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().assertDocumentsCountOnList(true, 2); - mEnv.bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2); - mEnv.bot().assertSearchTextField(false, query); + bot.assertDocumentsCountOnList(true, 2); + bot.assertHasDocuments(fileName1, fileName2); + + bot.assertSearchTextField(false, query); } public void testSearchResultsFound_ClearsOnBack() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); + + String query = fileName1; + bot.openSearchView(); + bot.setSearchQuery(query); - String query = UiTestEnvironment.fileName1; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + device.pressEnter(); + device.pressBack(); - mEnv.device().pressEnter(); - mEnv.device().pressBack(); - mEnv.assertDefaultContentOfTestDir0(); + assertDefaultContentOfTestDir0(); } public void testSearch_NoResults() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "chocolate"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().assertDocumentsCountOnList(false, 0); + bot.assertDocumentsCountOnList(false, 0); - String msg = String.valueOf(mEnv.context().getString(R.string.no_results)); - mEnv.bot().assertMessageTextView(String.format(msg, "TEST_ROOT_0")); - mEnv.bot().assertSearchTextField(false, query); + device.waitForIdle(); + String msg = String.valueOf(context.getString(R.string.no_results)); + bot.assertMessageTextView(String.format(msg, "TEST_ROOT_0")); + + bot.assertSearchTextField(false, query); } public void testSearchNoResults_ClearsOnBack() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); String query = "chocolate"; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + bot.openSearchView(); + bot.setSearchQuery(query); + + device.pressEnter(); + device.pressBack(); - mEnv.device().pressEnter(); - mEnv.device().pressBack(); - mEnv.assertDefaultContentOfTestDir0(); + device.waitForIdle(); + assertDefaultContentOfTestDir0(); } public void testSearchResultsFound_ClearsOnDirectoryChange() throws Exception { - mEnv.initTestFiles(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + initTestFiles(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); - String query = UiTestEnvironment.fileName1; - mEnv.bot().openSearchView(); - mEnv.bot().setSearchQuery(query); + String query = fileName1; + bot.openSearchView(); + bot.setSearchQuery(query); - mEnv.device().pressEnter(); + device.pressEnter(); - mEnv.bot().openRoot(ROOT_1_ID); - mEnv.assertDefaultContentOfTestDir1(); + bot.openRoot(ROOT_1_ID); + assertDefaultContentOfTestDir1(); - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.assertDefaultContentOfTestDir0(); + bot.openRoot(ROOT_0_ID); + assertDefaultContentOfTestDir0(); } public void testSearchIconVisible_RootWithSearchSupport() throws Exception { - mEnv.bot().openRoot(ROOT_0_ID); - mEnv.bot().assertSearchTextFiledAndIcon(false, true); + bot.openRoot(ROOT_0_ID); + bot.assertSearchTextFiledAndIcon(false, true); } public void testSearchIconHidden_RootNoSearchSupport() throws Exception { - mEnv.bot().openRoot(ROOT_1_ID); - mEnv.bot().assertSearchTextFiledAndIcon(false, false); + bot.openRoot(ROOT_1_ID); + bot.assertSearchTextFiledAndIcon(false, false); } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java index d609fa846591..417fd24e2812 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/UiBot.java @@ -47,8 +47,10 @@ import java.util.regex.Pattern; * programmatically, and making assertions against the state of the UI. */ class UiBot { + public static final String TARGET_PKG = "com.android.documentsui"; private static final String TAG = "UiBot"; + private static final String LAUNCHER_PKG = "com.android.launcher"; private static final BySelector SNACK_DELETE = By.desc(Pattern.compile("^Deleting [0-9]+ file.+")); @@ -390,4 +392,13 @@ class UiBot { } } + void revealLauncher() { + mDevice.pressHome(); + mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), mTimeout); + } + + void revealApp() { + mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), mTimeout); + mDevice.waitForIdle(); + } } diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java b/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java deleted file mode 100644 index 9e30589aa973..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/UiTestEnvironment.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2016 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.documentsui; - -import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.app.Instrumentation; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.os.RemoteException; -import android.provider.DocumentsContract.Document; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.Until; -import android.view.MotionEvent; - -import com.android.documentsui.model.RootInfo; - -/** - * Provides basic test environment for UI tests: - * - Launches activity - * - Creates and gives access to test root directories and test files - * - Cleans up the test environment - */ -class UiTestEnvironment { - - public static final int TIMEOUT = 5000; - public static final String NO_RENAME = "NO_RENAME"; - - public static final String dirName1 = "Dir1"; - public static final String fileName1 = "file1.log"; - public static final String fileName2 = "file12.png"; - public static final String fileName3 = "anotherFile0.log"; - public static final String fileName4 = "poodles.text"; - public static final String fileNameNoRename = NO_RENAME + "file.txt"; - - private static final String TARGET_PKG = "com.android.documentsui"; - private static final String LAUNCHER_PKG = "com.android.launcher"; - - private final UiBot mBot; - private final UiDevice mDevice; - private final Context mContext; - - private RootInfo mRootDir0; - private RootInfo mRootDir1; - private int mDocsCountDir0; - private int mDocsCountDir1; - - private ContentResolver mResolver; - private DocumentsProviderHelper mDocsHelper; - private ContentProviderClient mClient; - - private final Instrumentation mInstrumentation; - - public UiTestEnvironment(Instrumentation instrumentation) { - mInstrumentation = instrumentation; - mDevice = UiDevice.getInstance(mInstrumentation); - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = mInstrumentation.getTargetContext(); - mBot = new UiBot(mDevice, mContext, TIMEOUT); - } - -/** - * Launches default activity and waits for the application to appear. - * @throws Exception - */ - public void launch() throws Exception { - Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(TARGET_PKG); - launch(intent); - } - - /** - * Launches activity specified by intent and waits for the application to appear. - * @param intent Intent describing activity to launch. - * @throws Exception - */ - public void launch(Intent intent) throws Exception { - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - // Start from the home screen. - mDevice.pressHome(); - mDevice.wait(Until.hasObject(By.pkg(LAUNCHER_PKG).depth(0)), TIMEOUT); - - mResolver = mContext.getContentResolver(); - mClient = mResolver.acquireUnstableContentProviderClient(DEFAULT_AUTHORITY); - mDocsHelper = new DocumentsProviderHelper(DEFAULT_AUTHORITY, mClient); - - // Launch app. - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); - // Wait for the app to appear. - mDevice.wait(Until.hasObject(By.pkg(TARGET_PKG).depth(0)), TIMEOUT); - mDevice.waitForIdle(); - - resetStorage(); // Just incase a test failed and tearDown didn't happen. - } - - public void cleanUp() throws Exception { - resetStorage(); - mClient.release(); - } - - public void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - mDevice.waitForIdle(); - } - - public void initTestFiles() throws RemoteException { - mRootDir0 = mDocsHelper.getRoot(ROOT_0_ID); - mRootDir1 = mDocsHelper.getRoot(ROOT_1_ID); - - mDocsHelper.createFolder(mRootDir0, dirName1); - mDocsHelper.createDocument(mRootDir0, "text/plain", fileName1); - mDocsHelper.createDocument(mRootDir0, "image/png", fileName2); - mDocsHelper.createDocumentWithFlags(mRootDir0.documentId, "text/plain", fileNameNoRename, - Document.FLAG_SUPPORTS_WRITE); - mDocsCountDir0 = 4; - - mDocsHelper.createDocument(mRootDir1, "text/plain", fileName3); - mDocsHelper.createDocument(mRootDir1, "text/plain", fileName4); - mDocsCountDir1 = 2; - } - - public void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException { - bot().assertDocumentsCount(ROOT_0_ID, getDocumentsCountDir0()); - bot().assertHasDocuments(UiTestEnvironment.fileName1, UiTestEnvironment.fileName2, - UiTestEnvironment.dirName1, UiTestEnvironment.fileNameNoRename); - } - - public void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException { - bot().assertDocumentsCount(ROOT_1_ID, getDocumentsCountDir1()); - bot().assertHasDocuments(UiTestEnvironment.fileName3, UiTestEnvironment.fileName4); - } - - public UiBot bot() { - return mBot; - } - - public UiDevice device() { - return mDevice; - } - - public Context context() { - return mContext; - } - - public RootInfo getRootDir0() { - return mRootDir0; - } - - public int getDocumentsCountDir0() { - return mDocsCountDir0; - } - - public int getDocumentsCountDir1() { - return mDocsCountDir1; - } -} diff --git a/packages/Shell/res/values/strings.xml b/packages/Shell/res/values/strings.xml index e8e607b61f28..c26b54978e1d 100644 --- a/packages/Shell/res/values/strings.xml +++ b/packages/Shell/res/values/strings.xml @@ -13,14 +13,13 @@ See the License for the specific language governing permissions and limitations under the License. --> - -<resources> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label">Shell</string> <!-- Title of notification indicating a bugreport is being generated. [CHAR LIMIT=50] --> - <string name="bugreport_in_progress_title">Bug report is being generated</string> + <string name="bugreport_in_progress_title">Bug report <xliff:g id="id">#%d</xliff:g> is being generated</string> <!-- Title of notification indicating a bugreport has been successfully captured. [CHAR LIMIT=50] --> - <string name="bugreport_finished_title">Bug report captured</string> + <string name="bugreport_finished_title">Bug report <xliff:g id="id">#%d</xliff:g> captured</string> <!-- Title of notification indicating a bugreport is being updated before it can be shared. [CHAR LIMIT=50] --> <string name="bugreport_updating_title">Adding details to the bug report</string> <!-- Content notification indicating a bugreport is being updated before it can be shared, asking the user to wait [CHAR LIMIT=50] --> @@ -53,12 +52,12 @@ <string name="bugreport_screenshot_action">Screenshot</string> <!-- Toast message sent when the a screenshot for the bug report was taken successfully. --> - <string name="bugreport_screenshot_taken">Screenshot taken succesfully.</string> + <string name="bugreport_screenshot_taken">Screenshot taken successfully.</string> <!-- Toast message sent when the a screenshot for the bug report was not taken due to an error. --> <string name="bugreport_screenshot_failed">Screenshot could not be taken.</string> <!-- Title of the dialog asking for user-defined bug report details like name, title, and description. --> - <string name="bugreport_info_dialog_title">Bug report details</string> + <string name="bugreport_info_dialog_title">Bug report <xliff:g id="id">#%d</xliff:g> details</string> <!-- Text of the hint asking for the bug report name, which when set will define a suffix in the bug report file names. [CHAR LIMIT=30] --> diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 78197b35f613..8c555a655bef 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -438,7 +438,7 @@ public class BugreportProgressService extends Service { mContext.getString(R.string.bugreport_screenshot_action), screenshotPendingIntent).build(); - final String title = mContext.getString(R.string.bugreport_in_progress_title); + final String title = mContext.getString(R.string.bugreport_in_progress_title, info.pid); final String name = info.name != null ? info.name : mContext.getString(R.string.bugreport_unnamed); @@ -880,7 +880,7 @@ public class BugreportProgressService extends Service { shareIntent.putExtra(EXTRA_PID, info.pid); shareIntent.putExtra(EXTRA_INFO, info); - final String title = context.getString(R.string.bugreport_finished_title); + final String title = context.getString(R.string.bugreport_finished_title, info.pid); final Notification.Builder builder = new Notification.Builder(context) .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) .setContentTitle(title) @@ -1232,7 +1232,7 @@ public class BugreportProgressService extends Service { mDialog = new AlertDialog.Builder(context) .setView(view) - .setTitle(context.getString(R.string.bugreport_info_dialog_title)) + .setTitle(context.getString(R.string.bugreport_info_dialog_title, pid)) .setCancelable(false) .setPositiveButton(context.getString(com.android.internal.R.string.ok), null) diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index ea85c6183fad..8c62670dfa7c 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import java.util.SortedSet; @@ -58,6 +59,7 @@ import android.os.SystemProperties; import android.service.notification.StatusBarNotification; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; +import android.support.test.uiautomator.UiObjectNotFoundException; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.text.TextUtils; @@ -113,7 +115,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { private static final String NO_NAME = null; private static final String NO_SCREENSHOT = null; private static final String NO_TITLE = null; - private static final Integer NO_PID = null; + private static final int NO_PID = 0; private static final boolean RENAMED_SCREENSHOTS = true; private static final boolean DIDNT_RENAME_SCREENSHOTS = false; @@ -159,16 +161,20 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportStarted(1000); waitForScreenshotButtonEnabled(true); - assertProgressNotification(NAME, "0.00%"); + final NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(2); + nf.setMaximumFractionDigits(2); + + assertProgressNotification(NAME, nf.format(0)); SystemProperties.set(PROGRESS_PROPERTY, "108"); - assertProgressNotification(NAME, "10.80%"); + assertProgressNotification(NAME, nf.format(0.108)); SystemProperties.set(PROGRESS_PROPERTY, "500"); - assertProgressNotification(NAME, "50.00%"); + assertProgressNotification(NAME, nf.format(0.50)); SystemProperties.set(MAX_PROPERTY, "2000"); - assertProgressNotification(NAME, "25.00%"); + assertProgressNotification(NAME, nf.format(0.25)); Bundle extras = sendBugreportFinishedAndGetSharedIntent(PID, mPlainTextPath, mScreenshotPath); @@ -198,11 +204,11 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportFinished(PID, mPlainTextPath, mScreenshotPath); if (serviceDies) { - waitShareNotification(); + waitShareNotification(PID); killService(); } - Bundle extras = acceptBugreportAndGetSharedIntent(); + Bundle extras = acceptBugreportAndGetSharedIntent(PID); assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, PID, ZIP_FILE, NAME, NO_TITLE, NO_DESCRIPTION, 2, RENAMED_SCREENSHOTS); @@ -222,7 +228,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportStarted(1000); sendBugreportFinished(PID, mPlainTextPath, NO_SCREENSHOT); - waitShareNotification(); + waitShareNotification(PID); // There's no indication in the UI about the screenshot finish, so just sleep like a baby... Thread.sleep(SAFE_SCREENSHOT_DELAY * DateUtils.SECOND_IN_MILLIS); @@ -231,7 +237,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { killService(); } - Bundle extras = acceptBugreportAndGetSharedIntent(); + Bundle extras = acceptBugreportAndGetSharedIntent(PID); assertActionSendMultiple(extras, BUGREPORT_CONTENT, NO_SCREENSHOT, PID, ZIP_FILE, NAME, NO_TITLE, NO_DESCRIPTION, 1, RENAMED_SCREENSHOTS); @@ -243,7 +249,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportStarted(1000); waitForScreenshotButtonEnabled(true); - DetailsUi detailsUi = new DetailsUi(mUiBot); + DetailsUi detailsUi = new DetailsUi(mUiBot, PID); // Check initial name. String actualName = detailsUi.nameField.getText().toString(); @@ -296,7 +302,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportStarted(1000); waitForScreenshotButtonEnabled(true); - DetailsUi detailsUi = new DetailsUi(mUiBot); + DetailsUi detailsUi = new DetailsUi(mUiBot, PID); // Check initial name. String actualName = detailsUi.nameField.getText().toString(); @@ -326,7 +332,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { sendBugreportStarted(1000); waitForScreenshotButtonEnabled(true); - DetailsUi detailsUi = new DetailsUi(mUiBot); + DetailsUi detailsUi = new DetailsUi(mUiBot, PID); detailsUi.nameField.setText(""); detailsUi.titleField.setText(""); @@ -363,14 +369,14 @@ public class BugreportReceiverTest extends InstrumentationTestCase { waitForScreenshotButtonEnabled(true); } - DetailsUi detailsUi = new DetailsUi(mUiBot); + DetailsUi detailsUi = new DetailsUi(mUiBot, PID); // Finish the bugreport while user's still typing the name. detailsUi.nameField.setText(NEW_NAME); sendBugreportFinished(PID, mPlainTextPath, mScreenshotPath); // Wait until the share notification is received... - mUiBot.getNotification(mContext.getString(R.string.bugreport_finished_title)); + waitShareNotification(PID); // ...then close notification bar. mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); @@ -384,7 +390,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { detailsUi.clickOk(); // Finally, share bugreport. - Bundle extras = acceptBugreportAndGetSharedIntent(); + Bundle extras = acceptBugreportAndGetSharedIntent(PID); assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, PID, TITLE, NAME, TITLE, mDescription, 1, RENAMED_SCREENSHOTS); @@ -397,7 +403,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { // Send notification and click on share. sendBugreportFinished(NO_PID, mPlainTextPath, null); - acceptBugreport(); + acceptBugreport(NO_PID); // Handle the warning mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm)); @@ -421,7 +427,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { public void testShareBugreportAfterServiceDies() throws Exception { sendBugreportFinished(NO_PID, mPlainTextPath, NO_SCREENSHOT); killService(); - Bundle extras = acceptBugreportAndGetSharedIntent(); + Bundle extras = acceptBugreportAndGetSharedIntent(NO_PID); assertActionSendMultiple(extras, BUGREPORT_CONTENT, NO_SCREENSHOT); } @@ -457,14 +463,14 @@ public class BugreportReceiverTest extends InstrumentationTestCase { private void assertProgressNotification(String name, String percent) { // TODO: it currently looks for 3 distinct objects, without taking advantage of their // relationship. - openProgressNotification(); + openProgressNotification(PID); Log.v(TAG, "Looking for progress notification details: '" + name + "-" + percent + "'"); mUiBot.getObject(name); mUiBot.getObject(percent); } - private void openProgressNotification() { - String title = mContext.getString(R.string.bugreport_in_progress_title); + private void openProgressNotification(int pid) { + String title = mContext.getString(R.string.bugreport_in_progress_title, pid); Log.v(TAG, "Looking for progress notification title: '" + title + "'"); mUiBot.getNotification(title); } @@ -494,7 +500,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { */ private Bundle sendBugreportFinishedAndGetSharedIntent(String bugreportPath, String screenshotPath) { - return sendBugreportFinishedAndGetSharedIntent(null, bugreportPath, screenshotPath); + return sendBugreportFinishedAndGetSharedIntent(NO_PID, bugreportPath, screenshotPath); } /** @@ -502,10 +508,10 @@ public class BugreportReceiverTest extends InstrumentationTestCase { * * @return extras sent in the shared intent. */ - private Bundle sendBugreportFinishedAndGetSharedIntent(Integer pid, String bugreportPath, + private Bundle sendBugreportFinishedAndGetSharedIntent(int pid, String bugreportPath, String screenshotPath) { sendBugreportFinished(pid, bugreportPath, screenshotPath); - return acceptBugreportAndGetSharedIntent(); + return acceptBugreportAndGetSharedIntent(pid); } /** @@ -513,8 +519,8 @@ public class BugreportReceiverTest extends InstrumentationTestCase { * * @return extras sent in the shared intent. */ - private Bundle acceptBugreportAndGetSharedIntent() { - acceptBugreport(); + private Bundle acceptBugreportAndGetSharedIntent(int pid) { + acceptBugreport(pid); mUiBot.chooseActivity(UI_NAME); return mListener.getExtras(); } @@ -522,24 +528,24 @@ public class BugreportReceiverTest extends InstrumentationTestCase { /** * Waits for the notification to share the finished bugreport. */ - private void waitShareNotification() { - mUiBot.getNotification(mContext.getString(R.string.bugreport_finished_title)); + private void waitShareNotification(int pid) { + mUiBot.getNotification(mContext.getString(R.string.bugreport_finished_title, pid)); } /** * Accepts the notification to share the finished bugreport. */ - private void acceptBugreport() { - mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title)); + private void acceptBugreport(int pid) { + mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, pid)); } /** * Sends a "bugreport finished" intent. */ - private void sendBugreportFinished(Integer pid, String bugreportPath, String screenshotPath) { + private void sendBugreportFinished(int pid, String bugreportPath, String screenshotPath) { Intent intent = new Intent(INTENT_BUGREPORT_FINISHED); intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); - if (pid != null) { + if (pid != NO_PID) { intent.putExtra(EXTRA_PID, pid); } if (bugreportPath != null) { @@ -775,7 +781,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { * Gets the notification button used to take a screenshot. */ private UiObject getScreenshotButton() { - openProgressNotification(); + openProgressNotification(PID); return mUiBot.getVisibleObject( mContext.getString(R.string.bugreport_screenshot_action).toUpperCase()); } @@ -827,12 +833,15 @@ public class BugreportReceiverTest extends InstrumentationTestCase { /** * Gets the UI objects by opening the progress notification and clicking DETAILS. */ - DetailsUi(UiBot uiBot) { - openProgressNotification(); + DetailsUi(UiBot uiBot, int pid) throws UiObjectNotFoundException { + openProgressNotification(pid); detailsButton = mUiBot.getVisibleObject( mContext.getString(R.string.bugreport_info_action).toUpperCase()); mUiBot.click(detailsButton, "details_button"); // TODO: unhardcode resource ids + UiObject dialogTitle = mUiBot.getVisibleObjectById("android:id/alertTitle"); + assertEquals("Wrong title", mContext.getString(R.string.bugreport_info_dialog_title, + pid), dialogTitle.getText().toString()); nameField = mUiBot.getVisibleObjectById("com.android.shell:id/name"); titleField = mUiBot.getVisibleObjectById("com.android.shell:id/title"); descField = mUiBot.getVisibleObjectById("com.android.shell:id/description"); @@ -849,7 +858,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { } void reOpen() { - openProgressNotification(); + openProgressNotification(PID); mUiBot.click(detailsButton, "details_button"); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 3f482c82011a..3b49d3785384 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -205,7 +205,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD ? stack.indexOfStackTask(launchTarget) : 0; boolean hasNavBarScrim = (taskCount > 0) && !config.hasTransposedNavBar; - boolean animateNavBarScrim = true; + boolean animateNavBarScrim = !launchState.launchedWhileDocking; mScrimViews.prepareEnterRecentsAnimation(hasNavBarScrim, animateNavBarScrim); // Keep track of whether we launched from the nav bar button or via alt-tab @@ -460,13 +460,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // wait on the system to send a signal that was never queued. RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); - launchState.launchedFromHome = false; - launchState.launchedFromSearchHome = false; - launchState.launchedFromAppWithThumbnail = false; - launchState.launchedToTaskId = -1; - launchState.launchedWithAltTab = false; - launchState.launchedHasConfigurationChanged = false; - launchState.launchedViaDragGesture = false; + launchState.reset(); MetricsLogger.hidden(this, MetricsEvent.OVERVIEW_ACTIVITY); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java index 177e8417f3fb..f7ebd945f761 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java @@ -34,10 +34,22 @@ public class RecentsActivityLaunchState { public boolean launchedReuseTaskStackViews; public boolean launchedHasConfigurationChanged; public boolean launchedViaDragGesture; + public boolean launchedWhileDocking; public int launchedToTaskId; public int launchedNumVisibleTasks; public int launchedNumVisibleThumbnails; + public void reset() { + launchedFromHome = false; + launchedFromSearchHome = false; + launchedFromAppWithThumbnail = false; + launchedToTaskId = -1; + launchedWithAltTab = false; + launchedHasConfigurationChanged = false; + launchedViaDragGesture = false; + launchedWhileDocking = false; + } + /** Called when the configuration has changed, and we want to reset any configuration specific * members. */ public void updateOnConfigurationChange() { @@ -46,6 +58,7 @@ public class RecentsActivityLaunchState { // Set this flag to indicate that the configuration has changed since Recents last launched launchedHasConfigurationChanged = true; launchedViaDragGesture = false; + launchedWhileDocking = false; } /** diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index dd7b7c1b89e6..5890b5f959d3 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -161,6 +161,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener boolean mCanReuseTaskStackViews = true; boolean mDraggingInRecents; boolean mReloadTasks; + boolean mLaunchedWhileDocking; // Task launching Rect mSearchBarBounds = new Rect(); @@ -270,10 +271,10 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener } public void showRecents(boolean triggeredFromAltTab, boolean draggingInRecents, - boolean animate, boolean reloadTasks) { + boolean animate, boolean launchedWhileDockingTask) { mTriggeredFromAltTab = triggeredFromAltTab; mDraggingInRecents = draggingInRecents; - mReloadTasks = reloadTasks; + mLaunchedWhileDocking = launchedWhileDockingTask; if (mFastAltTabTrigger.hasTriggered()) { // We are calling this from the doze trigger, so just fall through to show Recents mFastAltTabTrigger.resetTrigger(); @@ -338,6 +339,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener } mDraggingInRecents = false; + mLaunchedWhileDocking = false; mTriggeredFromAltTab = false; try { @@ -865,11 +867,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // In the case where alt-tab is triggered, we never get a preloadRecents() call, so we // should always preload the tasks now. If we are dragging in recents, reload them as // the stacks might have changed. - if (mReloadTasks || mTriggeredFromAltTab ||sInstanceLoadPlan == null) { + if (mLaunchedWhileDocking || mTriggeredFromAltTab ||sInstanceLoadPlan == null) { // Create a new load plan if preloadRecents() was never triggered sInstanceLoadPlan = loader.createLoadPlan(mContext); } - if (mReloadTasks || mTriggeredFromAltTab || !sInstanceLoadPlan.hasTasks()) { + if (mLaunchedWhileDocking || mTriggeredFromAltTab || !sInstanceLoadPlan.hasTasks()) { loader.preloadTasks(sInstanceLoadPlan, topTask.id, isTopTaskHome); } TaskStack stack = sInstanceLoadPlan.getTaskStack(); @@ -957,6 +959,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener launchState.launchedNumVisibleThumbnails = vr.numVisibleThumbnails; launchState.launchedHasConfigurationChanged = false; launchState.launchedViaDragGesture = mDraggingInRecents; + launchState.launchedWhileDocking = mLaunchedWhileDocking; Intent intent = new Intent(); intent.setClassName(RECENTS_PACKAGE, mRecentsIntentActivityName); diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java index fb86214b04d5..42ebfa95c662 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java @@ -287,13 +287,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { // wait on the system to send a signal that was never queued. RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); - launchState.launchedFromHome = false; - launchState.launchedFromSearchHome = false; - launchState.launchedFromAppWithThumbnail = false; - launchState.launchedToTaskId = -1; - launchState.launchedWithAltTab = false; - launchState.launchedHasConfigurationChanged = false; - launchState.launchedViaDragGesture = false; + launchState.reset(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index 5e113b997bce..d4624f58f09c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -185,7 +185,8 @@ public class RecentsView extends FrameLayout { // If we are already occluded by the app, then just set the default background scrim now. // Otherwise, defer until the enter animation completes to animate the scrim with the // tasks for the home animation. - if (launchState.launchedFromAppWithThumbnail || mStack.getTaskCount() == 0) { + if (launchState.launchedWhileDocking || launchState.launchedFromAppWithThumbnail + || mStack.getTaskCount() == 0) { mBackgroundScrim.setAlpha((int) (DEFAULT_SCRIM_ALPHA * 255)); } else { mBackgroundScrim.setAlpha(0); @@ -645,7 +646,8 @@ public class RecentsView extends FrameLayout { public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) { RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); - if (!launchState.launchedFromAppWithThumbnail && mStack.getTaskCount() > 0) { + if (!launchState.launchedWhileDocking && !launchState.launchedFromAppWithThumbnail + && mStack.getTaskCount() > 0) { animateBackgroundScrim(DEFAULT_SCRIM_ALPHA, TaskStackAnimationHelper.ENTER_FROM_HOME_TRANSLATION_DURATION); } diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerHandleView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerHandleView.java index 12e271397fba..36cfac8dd092 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerHandleView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerHandleView.java @@ -73,6 +73,7 @@ public class DividerHandleView extends ImageButton { private int mCurrentWidth; private int mCurrentHeight; private AnimatorSet mAnimator; + private boolean mTouching; public DividerHandleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -86,6 +87,9 @@ public class DividerHandleView extends ImageButton { } public void setTouching(boolean touching, boolean animate) { + if (touching == mTouching) { + return; + } if (mAnimator != null) { mAnimator.cancel(); mAnimator = null; @@ -103,6 +107,7 @@ public class DividerHandleView extends ImageButton { animateToTarget(touching ? mCircleDiameter : mWidth, touching ? mCircleDiameter : mHeight, touching); } + mTouching = touching; } private void animateToTarget(int targetWidth, int targetHeight, boolean touching) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 83c22b110433..1bdf5a1e698d 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -100,6 +100,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private final int[] mTempInt2 = new int[2]; private boolean mMoving; private int mTouchSlop; + private boolean mBackgroundLifted; private int mDividerInsets; private int mDisplayWidth; @@ -210,8 +211,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, mDockSide = mWindowManagerProxy.getDockSide(); initializeSnapAlgorithm(); mWindowManagerProxy.setResizing(true); - mWindowManager.setSlippery(false); if (touching) { + mWindowManager.setSlippery(false); liftBackground(); } return mDockSide != WindowManager.DOCKED_INVALID; @@ -389,6 +390,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, } private void liftBackground() { + if (mBackgroundLifted) { + return; + } if (isHorizontalDivision()) { mBackground.animate().scaleY(1.4f); } else { @@ -407,9 +411,13 @@ public class DividerView extends FrameLayout implements OnTouchListener, .setDuration(TOUCH_ANIMATION_DURATION) .translationZ(mTouchElevation) .start(); + mBackgroundLifted = true; } private void releaseBackground() { + if (!mBackgroundLifted) { + return; + } mBackground.animate() .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .setDuration(TOUCH_RELEASE_ANIMATION_DURATION) @@ -422,6 +430,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, .setDuration(TOUCH_RELEASE_ANIMATION_DURATION) .translationZ(0) .start(); + mBackgroundLifted = false; } @Override @@ -485,7 +494,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, } // Make sure shadows are updated - mBackground.invalidate(); + if (mBackground.getZ() > 0f) { + mBackground.invalidate(); + } mLastResizeRect.set(mDockedRect); if (taskPosition != TASK_POSITION_SAME) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index 232c080266c0..3335315f6c01 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -200,10 +200,6 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } } - public MotionEventInjector getMotionEventInjector() { - return mMotionEventInjector; - } - /** * Gets current event stream state associated with an input event. * @return The event stream state that should be used for the event. Null if the event should diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 53504cc2f6c6..4be6833d17b5 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -52,7 +52,6 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.Debug; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -129,6 +128,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private static final int WAIT_WINDOWS_TIMEOUT_MILLIS = 5000; + // TODO: Restructure service initialization so services aren't connected before all of + // their capabilities are ready. + private static final int WAIT_MOTION_INJECTOR_TIMEOUT_MILLIS = 1000; + private static final String FUNCTION_REGISTER_UI_TEST_AUTOMATION_SERVICE = "registerUiTestAutomationService"; @@ -650,7 +653,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mUiAutomationFlags = flags; userState.mIsAccessibilityEnabled = true; userState.mInstalledServices.add(accessibilityServiceInfo); - if (userState.isUiAutomationSuppressingOtherServices()) { + if ((flags & UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES) == 0) { // Set the temporary state. userState.mIsTouchExplorationEnabled = false; userState.mIsEnhancedWebAccessibilityEnabled = false; @@ -794,6 +797,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { void setMotionEventInjector(MotionEventInjector motionEventInjector) { synchronized (mLock) { mMotionEventInjector = motionEventInjector; + // We may be waiting on this object being set + mLock.notifyAll(); } } @@ -2655,10 +2660,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { @Override public void sendMotionEvents(int sequence, ParceledListSlice events) { synchronized (mLock) { - if (mSecurityPolicy.canPerformGestures(this) && (mMotionEventInjector != null)) { - mMotionEventInjector.injectEvents((List<MotionEvent>) events.getList(), - mServiceInterface, sequence); - return; + if (mSecurityPolicy.canPerformGestures(this)) { + final long endMillis = + SystemClock.uptimeMillis() + WAIT_MOTION_INJECTOR_TIMEOUT_MILLIS; + while ((mMotionEventInjector == null) + && (SystemClock.uptimeMillis() < endMillis)) { + try { + mLock.wait(endMillis - SystemClock.uptimeMillis()); + } catch (InterruptedException ie) { + /* ignore */ + } + } + if (mMotionEventInjector != null) { + mMotionEventInjector.injectEvents((List<MotionEvent>) events.getList(), + mServiceInterface, sequence); + return; + } else { + Slog.e(LOG_TAG, "MotionEventInjector installation timed out"); + } } } try { diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index ecba0a48b493..4dbb49005c28 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -62,6 +62,10 @@ import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.VerifyCredentialResponse; import com.android.server.LockSettingsStorage.CredentialHash; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + import java.util.Arrays; import java.util.List; @@ -510,9 +514,9 @@ public class LockSettingsService extends ILockSettings.Stub { } } - private void unlockUser(int userId, byte[] token) { + private void unlockUser(int userId, byte[] token, byte[] secret) { try { - ActivityManagerNative.getDefault().unlockUser(userId, token); + ActivityManagerNative.getDefault().unlockUser(userId, token, secret); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -560,6 +564,7 @@ public class LockSettingsService extends ILockSettings.Stub { getGateKeeperService().clearSecureUserId(userId); mStorage.writePatternHash(null, userId); setKeystorePassword(null, userId); + clearUserKeyProtection(userId); return; } @@ -573,6 +578,7 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] enrolledHandle = enrollCredential(currentHandle, savedCredential, pattern, userId); if (enrolledHandle != null) { mStorage.writePatternHash(enrolledHandle, userId); + setUserKeyProtection(userId, pattern, verifyPattern(pattern, 0, userId)); } else { throw new RemoteException("Failed to enroll pattern"); } @@ -588,6 +594,7 @@ public class LockSettingsService extends ILockSettings.Stub { getGateKeeperService().clearSecureUserId(userId); mStorage.writePasswordHash(null, userId); setKeystorePassword(null, userId); + clearUserKeyProtection(userId); return; } @@ -601,6 +608,7 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] enrolledHandle = enrollCredential(currentHandle, savedCredential, password, userId); if (enrolledHandle != null) { mStorage.writePasswordHash(enrolledHandle, userId); + setUserKeyProtection(userId, password, verifyPassword(password, 0, userId)); } else { throw new RemoteException("Failed to enroll password"); } @@ -633,6 +641,48 @@ public class LockSettingsService extends ILockSettings.Stub { return hash; } + private void setUserKeyProtection(int userId, String credential, VerifyCredentialResponse vcr) + throws RemoteException { + if (vcr == null) { + throw new RemoteException("Null response verifying a credential we just set"); + } + if (vcr.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) { + throw new RemoteException("Non-OK response verifying a credential we just set: " + + vcr.getResponseCode()); + } + byte[] token = vcr.getPayload(); + if (token == null) { + throw new RemoteException("Empty payload verifying a credential we just set"); + } + changeUserKey(userId, token, secretFromCredential(credential)); + } + + private void clearUserKeyProtection(int userId) throws RemoteException { + changeUserKey(userId, null, null); + } + + private static byte[] secretFromCredential(String credential) throws RemoteException { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-512"); + // Personalize the hash + byte[] personalization = "Android FBE credential hash" + .getBytes(StandardCharsets.UTF_8); + // Pad it to the block size of the hash function + personalization = Arrays.copyOf(personalization, 128); + digest.update(personalization); + digest.update(credential.getBytes(StandardCharsets.UTF_8)); + return digest.digest(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("NoSuchAlgorithmException for SHA-512"); + } + } + + private void changeUserKey(int userId, byte[] token, byte[] secret) + throws RemoteException { + final UserInfo userInfo = UserManager.get(mContext).getUserInfo(userId); + getMountService().changeUserKey(userId, userInfo.serialNumber, token, null, secret); + } + @Override public VerifyCredentialResponse checkPattern(String pattern, int userId) throws RemoteException { return doVerifyPattern(pattern, false, 0, userId); @@ -742,11 +792,11 @@ public class LockSettingsService extends ILockSettings.Stub { if (Arrays.equals(hash, storedHash.hash)) { unlockKeystore(credentialUtil.adjustForKeystore(credential), userId); - // TODO: pass through a meaningful token from gatekeeper to - // unlock credential keys; for now pass through a stub value to - // indicate that we came from a user challenge. - final byte[] token = String.valueOf(userId).getBytes(); - unlockUser(userId, token); + // Users with legacy credentials don't have credential-backed + // FBE keys, so just pass through a fake token/secret + Slog.i(TAG, "Unlocking user with fake token: " + userId); + final byte[] fakeToken = String.valueOf(userId).getBytes(); + unlockUser(userId, fakeToken, fakeToken); // migrate credential to GateKeeper credentialUtil.setCredential(credential, null, userId); @@ -786,11 +836,9 @@ public class LockSettingsService extends ILockSettings.Stub { // credential has matched unlockKeystore(credential, userId); - // TODO: pass through a meaningful token from gatekeeper to - // unlock credential keys; for now pass through a stub value to - // indicate that we came from a user challenge. - final byte[] token = String.valueOf(userId).getBytes(); - unlockUser(userId, token); + Slog.i(TAG, "Unlocking user " + userId + + " with token length " + response.getPayload().length); + unlockUser(userId, response.getPayload(), secretFromCredential(credential)); UserInfo info = UserManager.get(mContext).getUserInfo(userId); if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) { diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 5120e1b08f13..cbd477a9500b 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -2742,8 +2742,30 @@ class MountService extends IMountService.Stub } } + private SensitiveArg encodeBytes(byte[] bytes) { + if (ArrayUtils.isEmpty(bytes)) { + return new SensitiveArg("!"); + } else { + return new SensitiveArg(HexDump.toHexString(bytes)); + } + } + @Override - public void unlockUserKey(int userId, int serialNumber, byte[] token) { + public void changeUserKey(int userId, int serialNumber, + byte[] token, byte[] oldSecret, byte[] newSecret) { + enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); + waitForReady(); + + try { + mCryptConnector.execute("cryptfs", "change_user_key", userId, serialNumber, + encodeBytes(token), encodeBytes(oldSecret), encodeBytes(newSecret)); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + + @Override + public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); waitForReady(); @@ -2753,16 +2775,9 @@ class MountService extends IMountService.Stub throw new IllegalStateException("Token required to unlock secure user " + userId); } - final String encodedToken; - if (ArrayUtils.isEmpty(token)) { - encodedToken = "!"; - } else { - encodedToken = HexDump.toHexString(token); - } - try { mCryptConnector.execute("cryptfs", "unlock_user_key", userId, serialNumber, - new SensitiveArg(encodedToken)); + encodeBytes(token), encodeBytes(secret)); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5125133904c3..393edb690d7b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14894,7 +14894,7 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println(mi.hasActivities ? ",a" : ",e"); } else { pw.print(tag); pw.print(","); pw.print(mi.shortLabel); pw.print(","); - pw.println(mi.pss); pw.print(dumpSwapPss ? mi.swapPss : "N/A"); + pw.print(mi.pss); pw.print(","); pw.println(dumpSwapPss ? mi.swapPss : "N/A"); } if (mi.subitems != null) { dumpMemItems(pw, prefix + " ", mi.shortLabel, mi.subitems, @@ -14959,6 +14959,9 @@ public final class ActivityManagerService extends ActivityManagerNative private final void dumpApplicationMemoryUsageHeader(PrintWriter pw, long uptime, long realtime, boolean isCheckinRequest, boolean isCompact) { + if (isCompact) { + pw.print("version,"); pw.println(MEMINFO_COMPACT_VERSION); + } if (isCheckinRequest || isCompact) { // short checkin version pw.print("time,"); pw.print(uptime); pw.print(","); pw.println(realtime); @@ -15017,6 +15020,9 @@ public final class ActivityManagerService extends ActivityManagerNative return stringifySize(size * 1024, 1024); } + // Update this version number in case you change the 'compact' format + private static final int MEMINFO_COMPACT_VERSION = 1; + final void dumpApplicationMemoryUsage(FileDescriptor fd, PrintWriter pw, String prefix, String[] args, boolean brief, PrintWriter categoryPw) { boolean dumpDetails = false; @@ -20340,8 +20346,8 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public boolean unlockUser(int userId, byte[] token) { - return mUserController.unlockUser(userId, token); + public boolean unlockUser(int userId, byte[] token, byte[] secret) { + return mUserController.unlockUser(userId, token, secret); } @Override diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index c352fc819884..0bccffa5b505 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1097,6 +1097,9 @@ final class ActivityStack { mHandler.removeMessages(STOP_TIMEOUT_MSG, r); r.stopped = true; r.state = ActivityState.STOPPED; + + mWindowManager.notifyAppStopped(r.appToken); + if (getVisibleBehindActivity() == r) { mStackSupervisor.requestVisibleBehindLocked(r, false); } @@ -1561,7 +1564,7 @@ final class ActivityStack { resumeNextActivity = false; } } else { - makeVisible(starting, r); + makeVisibleIfNeeded(starting, r); } // Aggregate current change flags. configChanges |= r.configChangeFlags; @@ -1719,28 +1722,30 @@ final class ActivityStack { return behindFullscreenActivity; } - private void makeVisible(ActivityRecord starting, ActivityRecord r) { + private void makeVisibleIfNeeded(ActivityRecord starting, ActivityRecord r) { + // This activity is not currently visible, but is running. Tell it to become visible. - r.visible = true; - if (r.state != ActivityState.RESUMED && r != starting) { - // If this activity is paused, tell it to now show its window. - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Making visible and scheduling visibility: " + r); - try { - if (mTranslucentActivityWaiting != null) { - r.updateOptionsLocked(r.returningOptions); - mUndrawnActivitiesBelowTopTranslucent.add(r); - } - setVisible(r, true); - r.sleeping = false; - r.app.pendingUiClean = true; - r.app.thread.scheduleWindowVisibility(r.appToken, true); - r.stopFreezingScreenLocked(false); - } catch (Exception e) { - // Just skip on any failure; we'll make it - // visible when it next restarts. - Slog.w(TAG, "Exception thrown making visibile: " + r.intent.getComponent(), e); + if (r.state == ActivityState.RESUMED || r == starting) { + return; + } + + // If this activity is paused, tell it to now show its window. + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, + "Making visible and scheduling visibility: " + r); + try { + if (mTranslucentActivityWaiting != null) { + r.updateOptionsLocked(r.returningOptions); + mUndrawnActivitiesBelowTopTranslucent.add(r); } + setVisible(r, true); + r.sleeping = false; + r.app.pendingUiClean = true; + r.app.thread.scheduleWindowVisibility(r.appToken, true); + r.stopFreezingScreenLocked(false); + } catch (Exception e) { + // Just skip on any failure; we'll make it + // visible when it next restarts. + Slog.w(TAG, "Exception thrown making visibile: " + r.intent.getComponent(), e); } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index f53e71a65dad..0beef53cbb70 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1932,7 +1932,7 @@ public final class ActivityStackSupervisor implements DisplayListener { private void ensureConfigurationAndResume(ActivityStack stack, ActivityRecord r, boolean preserveWindows) { - if (r == null) { + if (r == null || !r.visible) { return; } final boolean updated = stack.ensureActivityConfigurationLocked(r, 0, diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 2f63b2d3e9bf..a355fa4750eb 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -783,7 +783,7 @@ final class UserController { return result; } - boolean unlockUser(final int userId, byte[] token) { + boolean unlockUser(final int userId, byte[] token, byte[] secret) { if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) != PackageManager.PERMISSION_GRANTED) { String msg = "Permission Denial: unlockUser() from pid=" @@ -796,7 +796,7 @@ final class UserController { final long binderToken = Binder.clearCallingIdentity(); try { - return unlockUserCleared(userId, token); + return unlockUserCleared(userId, token, secret); } finally { Binder.restoreCallingIdentity(binderToken); } @@ -810,10 +810,10 @@ final class UserController { */ boolean maybeUnlockUser(final int userId) { // Try unlocking storage using empty token - return unlockUserCleared(userId, null); + return unlockUserCleared(userId, null, null); } - boolean unlockUserCleared(final int userId, byte[] token) { + boolean unlockUserCleared(final int userId, byte[] token, byte[] secret) { synchronized (mService) { // Bail if already running unlocked final UserState uss = mStartedUsers.get(userId); @@ -824,7 +824,7 @@ final class UserController { final UserInfo userInfo = getUserInfo(userId); final IMountService mountService = getMountService(); try { - mountService.unlockUserKey(userId, userInfo.serialNumber, token); + mountService.unlockUserKey(userId, userInfo.serialNumber, token, secret); } catch (RemoteException | RuntimeException e) { Slog.w(TAG, "Failed to unlock: " + e.getMessage()); return false; diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 7f8099e77f7a..b2e6adfd028a 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -760,9 +760,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (policy == null && meteredHint) { // policy doesn't exist, and AP is hinting that it's // metered: create an inferred policy. - policy = new NetworkPolicy(template, CYCLE_NONE, Time.TIMEZONE_UTC, - WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, - meteredHint, true); + policy = newWifiPolicy(template, meteredHint); addNetworkPolicyLocked(policy); } else if (policy != null && policy.inferred) { @@ -778,6 +776,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } }; + static NetworkPolicy newWifiPolicy(NetworkTemplate template, boolean metered) { + return new NetworkPolicy(template, CYCLE_NONE, Time.TIMEZONE_UTC, + WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, + metered, true); + } + /** * Observer that watches for {@link INetworkManagementService} alerts. */ @@ -2154,7 +2158,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ResultReceiver resultReceiver) throws RemoteException { - (new NetworkPolicyManagerShellCommand(this)).exec( + (new NetworkPolicyManagerShellCommand(mContext, this)).exec( this, in, out, err, args, resultReceiver); } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java index 281c3d0a5acb..5cd102556fc3 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java @@ -16,14 +16,22 @@ package com.android.server.net; +import static android.net.wifi.WifiInfo.removeDoubleQuotes; +import static com.android.server.net.NetworkPolicyManagerService.newWifiPolicy; import static com.android.server.net.NetworkPolicyManagerService.TAG; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import android.content.Context; import android.net.INetworkPolicyManager; import android.net.NetworkPolicy; +import android.net.NetworkTemplate; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; import android.os.Binder; import android.os.RemoteException; import android.os.ShellCommand; @@ -31,10 +39,12 @@ import android.util.Log; class NetworkPolicyManagerShellCommand extends ShellCommand { - final INetworkPolicyManager mInterface; + private final INetworkPolicyManager mInterface; + private final WifiManager mWifiManager; - NetworkPolicyManagerShellCommand(INetworkPolicyManager service) { + NetworkPolicyManagerShellCommand(Context context, INetworkPolicyManager service) { mInterface = service; + mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } @Override @@ -100,7 +110,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "metered-network": - return getNonMobileMeteredNetwork(); + return getMeteredWifiNetwork(); case "restrict-background": return getRestrictBackground(); } @@ -117,7 +127,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "metered-network": - return setNonMobileMeteredNetwork(); + return setMeteredWifiNetwork(); case "restrict-background": return setRestrictBackground(); } @@ -134,9 +144,9 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "metered-networks": - return listNonMobileMeteredNetworks(); + return listMeteredWifiNetworks(); case "restrict-background-whitelist": - return runListRestrictBackgroundWhitelist(); + return listRestrictBackgroundWhitelist(); } pw.println("Error: unknown list type '" + type + "'"); return -1; @@ -172,7 +182,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return -1; } - private int runListRestrictBackgroundWhitelist() throws RemoteException { + private int listRestrictBackgroundWhitelist() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final int[] uids = mInterface.getRestrictBackgroundWhitelistedUids(); pw.print("Restrict background whitelisted UIDs: "); @@ -238,11 +248,11 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int listNonMobileMeteredNetworks() throws RemoteException { + private int listMeteredWifiNetworks() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final String arg = getNextArg(); final Boolean filter = arg == null ? null : Boolean.valueOf(arg); - for (NetworkPolicy policy : getNonMobilePolicies()) { + for (NetworkPolicy policy : getWifiPolicies()) { if (filter != null && filter.booleanValue() != policy.metered) { continue; } @@ -253,14 +263,14 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int getNonMobileMeteredNetwork() throws RemoteException { + private int getMeteredWifiNetwork() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final String id = getNextArg(); if (id == null) { pw.println("Error: didn't specify ID"); return -1; } - final List<NetworkPolicy> policies = getNonMobilePolicies(); + final List<NetworkPolicy> policies = getWifiPolicies(); for (NetworkPolicy policy: policies) { if (id.equals(getNetworkId(policy))) { pw.println(policy.metered); @@ -270,7 +280,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int setNonMobileMeteredNetwork() throws RemoteException { + private int setMeteredWifiNetwork() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final String id = getNextArg(); if (id == null) { @@ -285,6 +295,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { final boolean metered = Boolean.valueOf(arg); final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null); boolean changed = false; + // First try to find a policy with such id for (NetworkPolicy policy : policies) { if (policy.template.isMatchRuleMobile() || policy.metered == metered) { continue; @@ -298,24 +309,57 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } if (changed) { mInterface.setNetworkPolicies(policies); + return 0; + } + // Policy not found: check if there is a saved wi-fi with such id. + for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) { + final String ssid = removeDoubleQuotes(config.SSID); + if (id.equals(ssid)) { + final NetworkPolicy policy = newPolicy(ssid); + Log.i(TAG, "Creating new policy for " + ssid + ": " + policy); + final NetworkPolicy[] newPolicies = new NetworkPolicy[policies.length + 1]; + System.arraycopy(policies, 0, newPolicies, 0, policies.length); + newPolicies[newPolicies.length - 1] = policy; + mInterface.setNetworkPolicies(newPolicies); + } } return 0; } - private List<NetworkPolicy> getNonMobilePolicies() throws RemoteException { + private List<NetworkPolicy> getWifiPolicies() throws RemoteException { + // First gets a list of saved wi-fi networks. + final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); + final Set<String> ssids = new HashSet<>(configs.size()); + for (WifiConfiguration config : configs) { + ssids.add(removeDoubleQuotes(config.SSID)); + } + + // Then gets the saved policies. final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null); - final List<NetworkPolicy> nonMobilePolicies = new ArrayList<NetworkPolicy>(policies.length); + final List<NetworkPolicy> wifiPolicies = new ArrayList<NetworkPolicy>(policies.length); for (NetworkPolicy policy: policies) { if (!policy.template.isMatchRuleMobile()) { - nonMobilePolicies.add(policy); + wifiPolicies.add(policy); + final String netId = getNetworkId(policy); + ssids.remove(netId); } } - return nonMobilePolicies; + // Finally, creates new default policies for saved WI-FIs not policied yet. + for (String ssid : ssids) { + final NetworkPolicy policy = newPolicy(ssid); + wifiPolicies.add(policy); + } + return wifiPolicies; + } + + private NetworkPolicy newPolicy(String ssid) { + final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(ssid); + final NetworkPolicy policy = newWifiPolicy(template, false); + return policy; } private String getNetworkId(NetworkPolicy policy) { - // ids are typically enclosed on double quotes (") - return policy.template.getNetworkId().replaceAll("^\"|\"$", ""); + return removeDoubleQuotes(policy.template.getNetworkId()); } private int getNextBooleanArg() { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ada745815241..c8645b467ca2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24,6 +24,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; +import static android.content.pm.PackageManager.DELETE_KEEP_DATA; import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; import static android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; @@ -70,6 +71,7 @@ import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.content.pm.PackageParser.PARSE_IS_PRIVILEGED; import static android.content.pm.PackageParser.isApkFile; import static android.os.Process.PACKAGE_INFO_GID; import static android.os.Process.SYSTEM_UID; @@ -357,6 +359,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_REQUIRE_KNOWN = 1<<12; static final int SCAN_MOVE = 1<<13; static final int SCAN_INITIAL = 1<<14; + static final int SCAN_CHECK_ONLY = 1<<15; static final int REMOVE_CHATTY = 1<<16; @@ -1425,6 +1428,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageInstalledInfo res = data.res; if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) { + //TODO: Broadcast for child packages too final String packageName = res.pkg.applicationInfo.packageName; res.removedInfo.sendBroadcast(false, true, false); Bundle extras = new Bundle(1); @@ -1886,11 +1890,20 @@ public class PackageManagerService extends IPackageManager.Stub { } } + void scheduleWritePackageRestrictionsLocked(UserHandle user) { + final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier(); + scheduleWritePackageRestrictionsLocked(userId); + } + void scheduleWritePackageRestrictionsLocked(int userId) { - if (!sUserManager.exists(userId)) return; - mDirtyUsers.add(userId); - if (!mHandler.hasMessages(WRITE_PACKAGE_RESTRICTIONS)) { - mHandler.sendEmptyMessageDelayed(WRITE_PACKAGE_RESTRICTIONS, WRITE_SETTINGS_DELAY); + final int[] userIds = (userId == UserHandle.USER_ALL) + ? sUserManager.getUserIds() : new int[]{userId}; + for (int nextUserId : userIds) { + if (!sUserManager.exists(nextUserId)) return; + mDirtyUsers.add(nextUserId); + if (!mHandler.hasMessages(WRITE_PACKAGE_RESTRICTIONS)) { + mHandler.sendEmptyMessageDelayed(WRITE_PACKAGE_RESTRICTIONS, WRITE_SETTINGS_DELAY); + } } } @@ -2216,7 +2229,7 @@ public class PackageManagerService extends IPackageManager.Stub { + ps.codePathString + ", installStatus=" + ps.installStatus + ", versionCode=" + ps.versionCode + "; scanned versionCode=" + scannedPkg.mVersionCode); - removePackageLI(ps, true); + removePackageSettingLI(scannedPkg, true); mExpectingBetter.put(ps.name, ps.codePath); } @@ -6263,9 +6276,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private void collectCertificatesLI(PackageParser pp, PackageSetting ps, - PackageParser.Package pkg, File srcFile, int parseFlags) - throws PackageManagerException { + private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, File srcFile, + int parseFlags) throws PackageManagerException { if (ps != null && ps.codePath.equals(srcFile) && ps.timeStamp == srcFile.lastModified() @@ -6294,7 +6306,7 @@ public class PackageManagerService extends IPackageManager.Stub { } try { - pp.collectCertificates(pkg, parseFlags); + PackageParser.collectCertificates(pkg, parseFlags); } catch (PackageParserException e) { throw PackageManagerException.from(e); } @@ -6338,6 +6350,56 @@ public class PackageManagerService extends IPackageManager.Stub { throw PackageManagerException.from(e); } + return scanPackageLI(pkg, scanFile, parseFlags, scanFlags, currentTime, user); + } + + /** + * Scans a package and returns the newly parsed package. + * @throws PackageManagerException on a parse error. + */ + private PackageParser.Package scanPackageLI(PackageParser.Package pkg, File scanFile, + int parseFlags, int scanFlags, long currentTime, UserHandle user) + throws PackageManagerException { + // If the package has children and this is the first dive in the function + // we scan the package with the SCAN_CHECK_ONLY flag set to see whether all + // packages (parent and children) would be successfully scanned before the + // actual scan since scanning mutates internal state and we want to atomically + // install the package and its children. + if ((scanFlags & SCAN_CHECK_ONLY) == 0) { + if (pkg.childPackages != null && pkg.childPackages.size() > 0) { + scanFlags |= SCAN_CHECK_ONLY; + } + } else { + scanFlags &= ~SCAN_CHECK_ONLY; + } + + // Scan the parent + PackageParser.Package scannedPkg = scanPackageInternalLI(pkg, scanFile, parseFlags, + scanFlags, currentTime, user); + + // Scan the children + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPackage = pkg.childPackages.get(i); + scanPackageInternalLI(childPackage, scanFile, parseFlags, scanFlags, + currentTime, user); + } + + + if ((scanFlags & SCAN_CHECK_ONLY) != 0) { + return scanPackageLI(pkg, scanFile, parseFlags, scanFlags, currentTime, user); + } + + return scannedPkg; + } + + /** + * Scans a package and returns the newly parsed package. + * @throws PackageManagerException on a parse error. + */ + private PackageParser.Package scanPackageInternalLI(PackageParser.Package pkg, File scanFile, + int parseFlags, int scanFlags, long currentTime, UserHandle user) + throws PackageManagerException { PackageSetting ps = null; PackageSetting updatedPkg; // reader @@ -6358,7 +6420,39 @@ public class PackageManagerService extends IPackageManager.Stub { // package name depending on our state. updatedPkg = mSettings.getDisabledSystemPkgLPr(ps != null ? ps.name : pkg.packageName); if (DEBUG_INSTALL && updatedPkg != null) Slog.d(TAG, "updatedPkg = " + updatedPkg); + + // If this is a package we don't know about on the system partition, we + // may need to remove disabled child packages on the system partition + // or may need to not add child packages if the parent apk is updated + // on the data partition and no longer defines this child package. + if ((parseFlags & PackageParser.PARSE_IS_SYSTEM) != 0) { + // If this is a parent package for an updated system app and this system + // app got an OTA update which no longer defines some of the child packages + // we have to prune them from the disabled system packages. + PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(pkg.packageName); + if (disabledPs != null) { + final int scannedChildCount = (pkg.childPackages != null) + ? pkg.childPackages.size() : 0; + final int disabledChildCount = disabledPs.childPackageNames != null + ? disabledPs.childPackageNames.size() : 0; + for (int i = 0; i < disabledChildCount; i++) { + String disabledChildPackageName = disabledPs.childPackageNames.get(i); + boolean disabledPackageAvailable = false; + for (int j = 0; j < scannedChildCount; j++) { + PackageParser.Package childPkg = pkg.childPackages.get(j); + if (childPkg.packageName.equals(disabledChildPackageName)) { + disabledPackageAvailable = true; + break; + } + } + if (!disabledPackageAvailable) { + mSettings.removeDisabledSystemPackageLPw(disabledChildPackageName); + } + } + } + } } + boolean updatedPkgBetter = false; // First check if this is a system package that may involve an update if (updatedPkg != null && (parseFlags & PackageParser.PARSE_IS_SYSTEM) != 0) { @@ -6391,10 +6485,24 @@ public class PackageManagerService extends IPackageManager.Stub { updatedPkg.resourcePathString = scanFile.toString(); } updatedPkg.pkg = pkg; - throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, - "Package " + ps.name + " at " + scanFile - + " ignored: updated version " + ps.versionCode - + " better than this " + pkg.mVersionCode); + updatedPkg.versionCode = pkg.mVersionCode; + + // Update the disabled system child packages to point to the package too. + final int childCount = updatedPkg.childPackageNames != null + ? updatedPkg.childPackageNames.size() : 0; + for (int i = 0; i < childCount; i++) { + String childPackageName = updatedPkg.childPackageNames.get(i); + PackageSetting updatedChildPkg = mSettings.getDisabledSystemPkgLPr( + childPackageName); + if (updatedChildPkg != null) { + updatedChildPkg.pkg = pkg; + updatedChildPkg.versionCode = pkg.mVersionCode; + } + } + + throw new PackageManagerException(Log.WARN, "Package " + ps.name + " at " + + scanFile + " ignored: updated version " + ps.versionCode + + " better than this " + pkg.mVersionCode); } else { // The current app on the system partition is better than // what we have updated to on the data partition; switch @@ -6439,7 +6547,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Verify certificates against what was last scanned - collectCertificatesLI(pp, ps, pkg, scanFile, parseFlags); + collectCertificatesLI(ps, pkg, scanFile, parseFlags); /* * A new system app appeared, but we already had a non-system one of the @@ -6456,7 +6564,7 @@ public class PackageManagerService extends IPackageManager.Stub { != PackageManager.SIGNATURE_MATCH) { logCriticalInfo(Log.WARN, "Package " + ps.name + " appeared on system, but" + " signatures don't match existing userdata copy; removing"); - deletePackageLI(pkg.packageName, null, true, null, null, 0, null, false); + deletePackageLI(pkg.packageName, null, true, null, null, 0, null, false, null); ps = null; } else { /* @@ -6515,13 +6623,13 @@ public class PackageManagerService extends IPackageManager.Stub { } // Set application objects path explicitly. - pkg.applicationInfo.volumeUuid = pkg.volumeUuid; - pkg.applicationInfo.setCodePath(pkg.codePath); - pkg.applicationInfo.setBaseCodePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitCodePaths(pkg.splitCodePaths); - pkg.applicationInfo.setResourcePath(resourcePath); - pkg.applicationInfo.setBaseResourcePath(baseResourcePath); - pkg.applicationInfo.setSplitResourcePaths(pkg.splitCodePaths); + pkg.setApplicationVolumeUuid(pkg.volumeUuid); + pkg.setApplicationInfoCodePath(pkg.codePath); + pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths); + pkg.setApplicationInfoResourcePath(resourcePath); + pkg.setApplicationInfoBaseResourcePath(baseResourcePath); + pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths); // Note that we invoke the following method only if we are about to unpack an application PackageParser.Package scannedPkg = scanPackageLI(pkg, parseFlags, scanFlags @@ -6534,7 +6642,7 @@ public class PackageManagerService extends IPackageManager.Stub { */ if (shouldHideSystemApp) { synchronized (mPackages) { - mSettings.disableSystemPackageLPw(pkg.packageName); + mSettings.disableSystemPackageLPw(pkg.packageName, true); } } @@ -6932,17 +7040,62 @@ public class PackageManagerService extends IPackageManager.Stub { } private void deleteCodeCacheDirsLI(String volumeUuid, String packageName) { + final PackageParser.Package pkg; + synchronized (mPackages) { + pkg = mPackages.get(packageName); + } + if (pkg == null) { + Slog.w(TAG, "Failed to delete code cache directory. No package: " + packageName); + return; + } + deleteCodeCacheDirsLI(pkg); + } + + private void deleteCodeCacheDirsLI(PackageParser.Package pkg) { // TODO: triage flags as part of 26466827 final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE; - final int[] users = sUserManager.getUserIds(); + int[] users = sUserManager.getUserIds(); + int res = 0; for (int user : users) { + // Remove the parent code cache try { - mInstaller.clearAppData(volumeUuid, packageName, user, + mInstaller.clearAppData(pkg.volumeUuid, pkg.packageName, user, flags | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } catch (InstallerException e) { Slog.w(TAG, "Failed to delete code cache directory", e); } + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + // Remove the child code cache + try { + mInstaller.clearAppData(childPkg.volumeUuid, childPkg.packageName, + user, flags | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); + } catch (InstallerException e) { + Slog.w(TAG, "Failed to delete code cache directory", e); + } + } + } + } + + private void setInstallAndUpdateTime(PackageParser.Package pkg, long firstInstallTime, + long lastUpdateTime) { + // Set parent install/update time + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps != null) { + ps.firstInstallTime = firstInstallTime; + ps.lastUpdateTime = lastUpdateTime; + } + // Set children install/update time + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + ps = (PackageSetting) childPkg.mExtras; + if (ps != null) { + ps.firstInstallTime = firstInstallTime; + ps.lastUpdateTime = lastUpdateTime; + } } } @@ -7066,11 +7219,39 @@ public class PackageManagerService extends IPackageManager.Stub { private PackageParser.Package scanPackageTracedLI(PackageParser.Package pkg, int parseFlags, int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage"); + // If the package has children and this is the first dive in the function + // we recursively scan the package with the SCAN_CHECK_ONLY flag set to see + // whether all packages (parent and children) would be successfully scanned + // before the actual scan since scanning mutates internal state and we want + // to atomically install the package and its children. + if ((scanFlags & SCAN_CHECK_ONLY) == 0) { + if (pkg.childPackages != null && pkg.childPackages.size() > 0) { + scanFlags |= SCAN_CHECK_ONLY; + } + } else { + scanFlags &= ~SCAN_CHECK_ONLY; + } + + final PackageParser.Package scannedPkg; try { - return scanPackageLI(pkg, parseFlags, scanFlags, currentTime, user); + // Scan the parent + scannedPkg = scanPackageLI(pkg, parseFlags, scanFlags, currentTime, user); + // Scan the children + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + scanPackageLI(childPkg, parseFlags, + scanFlags, currentTime, user); + } } finally { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } + + if ((scanFlags & SCAN_CHECK_ONLY) != 0) { + return scanPackageTracedLI(pkg, parseFlags, scanFlags, currentTime, user); + } + + return scannedPkg; } private PackageParser.Package scanPackageLI(PackageParser.Package pkg, int parseFlags, @@ -7089,7 +7270,8 @@ public class PackageManagerService extends IPackageManager.Stub { } private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, int parseFlags, - int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { + int scanFlags, long currentTime, UserHandle user) + throws PackageManagerException { final File scanFile = new File(pkg.codePath); if (pkg.applicationInfo.getCodePath() == null || pkg.applicationInfo.getResourcePath() == null) { @@ -7125,28 +7307,30 @@ public class PackageManagerService extends IPackageManager.Stub { "Core android package being redefined. Skipping."); } - // Set up information for our fall-back user intent resolution activity. - mPlatformPackage = pkg; - pkg.mVersionCode = mSdkVersion; - mAndroidApplication = pkg.applicationInfo; - - if (!mResolverReplaced) { - mResolveActivity.applicationInfo = mAndroidApplication; - mResolveActivity.name = ResolverActivity.class.getName(); - mResolveActivity.packageName = mAndroidApplication.packageName; - mResolveActivity.processName = "system:ui"; - mResolveActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE; - mResolveActivity.documentLaunchMode = ActivityInfo.DOCUMENT_LAUNCH_NEVER; - mResolveActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; - mResolveActivity.theme = R.style.Theme_Holo_Dialog_Alert; - mResolveActivity.exported = true; - mResolveActivity.enabled = true; - mResolveInfo.activityInfo = mResolveActivity; - mResolveInfo.priority = 0; - mResolveInfo.preferredOrder = 0; - mResolveInfo.match = 0; - mResolveComponentName = new ComponentName( - mAndroidApplication.packageName, mResolveActivity.name); + if ((scanFlags & SCAN_CHECK_ONLY) == 0) { + // Set up information for our fall-back user intent resolution activity. + mPlatformPackage = pkg; + pkg.mVersionCode = mSdkVersion; + mAndroidApplication = pkg.applicationInfo; + + if (!mResolverReplaced) { + mResolveActivity.applicationInfo = mAndroidApplication; + mResolveActivity.name = ResolverActivity.class.getName(); + mResolveActivity.packageName = mAndroidApplication.packageName; + mResolveActivity.processName = "system:ui"; + mResolveActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE; + mResolveActivity.documentLaunchMode = ActivityInfo.DOCUMENT_LAUNCH_NEVER; + mResolveActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; + mResolveActivity.theme = R.style.Theme_Holo_Dialog_Alert; + mResolveActivity.exported = true; + mResolveActivity.enabled = true; + mResolveInfo.activityInfo = mResolveActivity; + mResolveInfo.priority = 0; + mResolveInfo.preferredOrder = 0; + mResolveInfo.match = 0; + mResolveComponentName = new ComponentName( + mAndroidApplication.packageName, mResolveActivity.name); + } } } } @@ -7156,39 +7340,43 @@ public class PackageManagerService extends IPackageManager.Stub { Log.d(TAG, "Scanning package " + pkg.packageName); } - if (mPackages.containsKey(pkg.packageName) - || mSharedLibraries.containsKey(pkg.packageName)) { - throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, - "Application package " + pkg.packageName - + " already installed. Skipping duplicate."); - } - - // If we're only installing presumed-existing packages, require that the - // scanned APK is both already known and at the path previously established - // for it. Previously unknown packages we pick up normally, but if we have an - // a priori expectation about this package's install presence, enforce it. - // With a singular exception for new system packages. When an OTA contains - // a new system package, we allow the codepath to change from a system location - // to the user-installed location. If we don't allow this change, any newer, - // user-installed version of the application will be ignored. - if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) { - if (mExpectingBetter.containsKey(pkg.packageName)) { - logCriticalInfo(Log.WARN, - "Relax SCAN_REQUIRE_KNOWN requirement for package " + pkg.packageName); - } else { - PackageSetting known = mSettings.peekPackageLPr(pkg.packageName); - if (known != null) { - if (DEBUG_PACKAGE_SCANNING) { - Log.d(TAG, "Examining " + pkg.codePath - + " and requiring known paths " + known.codePathString - + " & " + known.resourcePathString); - } - if (!pkg.applicationInfo.getCodePath().equals(known.codePathString) - || !pkg.applicationInfo.getResourcePath().equals(known.resourcePathString)) { - throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, - "Application package " + pkg.packageName - + " found at " + pkg.applicationInfo.getCodePath() - + " but expected at " + known.codePathString + "; ignoring."); + synchronized (mPackages) { + if (mPackages.containsKey(pkg.packageName) + || mSharedLibraries.containsKey(pkg.packageName)) { + throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, + "Application package " + pkg.packageName + + " already installed. Skipping duplicate."); + } + + // If we're only installing presumed-existing packages, require that the + // scanned APK is both already known and at the path previously established + // for it. Previously unknown packages we pick up normally, but if we have an + // a priori expectation about this package's install presence, enforce it. + // With a singular exception for new system packages. When an OTA contains + // a new system package, we allow the codepath to change from a system location + // to the user-installed location. If we don't allow this change, any newer, + // user-installed version of the application will be ignored. + if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) { + if (mExpectingBetter.containsKey(pkg.packageName)) { + logCriticalInfo(Log.WARN, + "Relax SCAN_REQUIRE_KNOWN requirement for package " + pkg.packageName); + } else { + PackageSetting known = mSettings.peekPackageLPr(pkg.packageName); + if (known != null) { + if (DEBUG_PACKAGE_SCANNING) { + Log.d(TAG, "Examining " + pkg.codePath + + " and requiring known paths " + known.codePathString + + " & " + known.resourcePathString); + } + if (!pkg.applicationInfo.getCodePath().equals(known.codePathString) + || !pkg.applicationInfo.getResourcePath().equals( + known.resourcePathString)) { + throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, + "Application package " + pkg.packageName + + " found at " + pkg.applicationInfo.getCodePath() + + " but expected at " + known.codePathString + + "; ignoring."); + } } } } @@ -7208,6 +7396,11 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.mAdoptPermissions = null; } + // Getting the package setting may have a side-effect, so if we + // are only checking if scan would succeed, stash a copy of the + // old setting to restore at the end. + PackageSetting nonMutatedPs = null; + // writer synchronized (mPackages) { if (pkg.mSharedUserId != null) { @@ -7279,6 +7472,14 @@ public class PackageManagerService extends IPackageManager.Stub { + " was transferred to another, but its .apk remains"); } + // See comments in nonMutatedPs declaration + if ((scanFlags & SCAN_CHECK_ONLY) != 0) { + PackageSetting foundPs = mSettings.peekPackageLPr(pkg.packageName); + if (foundPs != null) { + nonMutatedPs = new PackageSetting(foundPs); + } + } + // Just create the setting, don't add it yet. For already existing packages // the PkgSetting exists already and doesn't have to be created. pkgSetting = mSettings.getPackageLPw(pkg, origPackage, realName, suid, destCodeFile, @@ -7305,13 +7506,15 @@ public class PackageManagerService extends IPackageManager.Stub { reportSettingsProblem(Log.WARN, msg); // Make a note of it. - mTransferedPackages.add(origPackage.name); + if ((scanFlags & SCAN_CHECK_ONLY) == 0) { + mTransferedPackages.add(origPackage.name); + } // No longer need to retain this. pkgSetting.origPackage = null; } - if (realName != null) { + if ((scanFlags & SCAN_CHECK_ONLY) == 0 && realName != null) { // Make a note of it. mTransferedPackages.add(pkg.packageName); } @@ -7413,7 +7616,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } - if (pkg.mAdoptPermissions != null) { + if ((scanFlags & SCAN_CHECK_ONLY) == 0 && pkg.mAdoptPermissions != null) { // This package wants to adopt ownership of permissions from // another package. for (int i = pkg.mAdoptPermissions.size() - 1; i >= 0; i--) { @@ -7537,6 +7740,33 @@ public class PackageManagerService extends IPackageManager.Stub { ArrayList<PackageParser.Package> clientLibPkgs = null; + if ((scanFlags & SCAN_CHECK_ONLY) != 0) { + if (nonMutatedPs != null) { + synchronized (mPackages) { + mSettings.mPackages.put(nonMutatedPs.name, nonMutatedPs); + } + } + return pkg; + } + + // Only privileged apps and updated privileged apps can add child packages. + if (pkg.childPackages != null && !pkg.childPackages.isEmpty()) { + if ((parseFlags & PARSE_IS_PRIVILEGED) == 0) { + throw new PackageManagerException("Only privileged apps and updated " + + "privileged apps can add child packages. Ignoring package " + + pkg.packageName); + } + final int childCount = pkg.childPackages.size(); + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + if (mSettings.hasOtherDisabledSystemPkgWithChildLPr(pkg.packageName, + childPkg.packageName)) { + throw new PackageManagerException("Cannot override a child package of " + + "another disabled system app. Ignoring package " + pkg.packageName); + } + } + } + // writer synchronized (mPackages) { if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) { @@ -7821,7 +8051,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Now that permission groups have a special meaning, we ignore permission // groups for legacy apps to prevent unexpected behavior. In particular, - // permissions for one app being granted to someone just becuase they happen + // permissions for one app being granted to someone just becase they happen // to be in a group defined by another app (before this had no implications). if (pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) { p.group = mPermissionGroups.get(p.info.group); @@ -8466,6 +8696,17 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private void killPackage(PackageParser.Package pkg, String reason) { + // Kill the parent package + killApplication(pkg.packageName, pkg.applicationInfo.uid, reason); + // Kill the child packages + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + killApplication(childPkg.packageName, childPkg.applicationInfo.uid, reason); + } + } + private void killApplication(String pkgName, int appId, String reason) { // 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 @@ -8479,7 +8720,24 @@ public class PackageManagerService extends IPackageManager.Stub { } } - void removePackageLI(PackageSetting ps, boolean chatty) { + private void removePackageSettingLI(PackageParser.Package pkg, boolean chatty) { + // Remove the parent package setting + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps != null) { + removePackageSettingLI(ps, chatty); + } + // Remove the child package setting + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + ps = (PackageSetting) childPkg.mExtras; + if (ps != null) { + removePackageSettingLI(ps, chatty); + } + } + } + + void removePackageSettingLI(PackageSetting ps, boolean chatty) { if (DEBUG_INSTALL) { if (chatty) Log.d(TAG, "Removing package " + ps.name); @@ -8503,8 +8761,17 @@ public class PackageManagerService extends IPackageManager.Stub { // writer synchronized (mPackages) { + // Remove the parent package mPackages.remove(pkg.applicationInfo.packageName); cleanPackageDataStructuresLILPw(pkg, chatty); + + // Remove the child packages + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + mPackages.remove(childPkg.applicationInfo.packageName); + cleanPackageDataStructuresLILPw(childPkg, chatty); + } } } @@ -8708,6 +8975,17 @@ public class PackageManagerService extends IPackageManager.Stub { static final int UPDATE_PERMISSIONS_REPLACE_PKG = 1<<1; static final int UPDATE_PERMISSIONS_REPLACE_ALL = 1<<2; + private void updatePermissionsLPw(PackageParser.Package pkg, int flags) { + // Update the parent permissions + updatePermissionsLPw(pkg.packageName, pkg, flags); + // Update the child permissions + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + updatePermissionsLPw(childPkg.packageName, childPkg, flags); + } + } + private void updatePermissionsLPw(String changingPkg, PackageParser.Package pkgInfo, int flags) { final String volumeUuid = (pkgInfo != null) ? getVolumeUuidForPackage(pkgInfo) : null; @@ -9125,7 +9403,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (pkg.isUpdatedSystemApp()) { final PackageSetting sysPs = mSettings .getDisabledSystemPkgLPr(pkg.packageName); - if (sysPs.getPermissionsState().hasInstallPermission(perm)) { + if (sysPs != null && sysPs.getPermissionsState().hasInstallPermission(perm)) { // If the original was granted this permission, we take // that grant decision as read and propagate it to the // update. @@ -9139,16 +9417,38 @@ public class PackageManagerService extends IPackageManager.Stub { // before. In this case we do want to allow the app to // now get the new permission if the ancestral apk is // privileged to get it. - if (sysPs.pkg != null && sysPs.isPrivileged()) { - for (int j=0; - j<sysPs.pkg.requestedPermissions.size(); j++) { - if (perm.equals( - sysPs.pkg.requestedPermissions.get(j))) { + if (sysPs != null && sysPs.pkg != null && sysPs.isPrivileged()) { + for (int j = 0; j < sysPs.pkg.requestedPermissions.size(); j++) { + if (perm.equals(sysPs.pkg.requestedPermissions.get(j))) { allowed = true; break; } } } + // Also if a privileged parent package on the system image or any of + // its children requested a privileged permission, the updated child + // packages can also get the permission. + if (pkg.parentPackage != null) { + final PackageSetting disabledSysParentPs = mSettings + .getDisabledSystemPkgLPr(pkg.parentPackage.packageName); + if (disabledSysParentPs != null && disabledSysParentPs.pkg != null + && disabledSysParentPs.isPrivileged()) { + if (isPackageRequestingPermission(disabledSysParentPs.pkg, perm)) { + allowed = true; + } else if (disabledSysParentPs.pkg.childPackages != null) { + final int count = disabledSysParentPs.pkg.childPackages.size(); + for (int i = 0; i < count; i++) { + PackageParser.Package disabledSysChildPkg = + disabledSysParentPs.pkg.childPackages.get(i); + if (isPackageRequestingPermission(disabledSysChildPkg, + perm)) { + allowed = true; + break; + } + } + } + } + } } } else { allowed = isPrivilegedApp(pkg); @@ -9192,6 +9492,17 @@ public class PackageManagerService extends IPackageManager.Stub { return allowed; } + private boolean isPackageRequestingPermission(PackageParser.Package pkg, String permission) { + final int permCount = pkg.requestedPermissions.size(); + for (int j = 0; j < permCount; j++) { + String requestedPermission = pkg.requestedPermissions.get(j); + if (permission.equals(requestedPermission)) { + return true; + } + } + return false; + } + final class ActivityIntentResolver extends IntentResolver<PackageParser.ActivityIntentInfo, ResolveInfo> { public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, @@ -11780,20 +12091,20 @@ public class PackageManagerService extends IPackageManager.Stub { resourceFile = afterCodeFile; // Reflect the rename in scanned details - pkg.codePath = afterCodeFile.getAbsolutePath(); - pkg.baseCodePath = FileUtils.rewriteAfterRename(beforeCodeFile, afterCodeFile, - pkg.baseCodePath); - pkg.splitCodePaths = FileUtils.rewriteAfterRename(beforeCodeFile, afterCodeFile, - pkg.splitCodePaths); + pkg.setCodePath(afterCodeFile.getAbsolutePath()); + pkg.setBaseCodePath(FileUtils.rewriteAfterRename(beforeCodeFile, + afterCodeFile, pkg.baseCodePath)); + pkg.setSplitCodePaths(FileUtils.rewriteAfterRename(beforeCodeFile, + afterCodeFile, pkg.splitCodePaths)); // Reflect the rename in app info - pkg.applicationInfo.volumeUuid = pkg.volumeUuid; - pkg.applicationInfo.setCodePath(pkg.codePath); - pkg.applicationInfo.setBaseCodePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitCodePaths(pkg.splitCodePaths); - pkg.applicationInfo.setResourcePath(pkg.codePath); - pkg.applicationInfo.setBaseResourcePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitResourcePaths(pkg.splitCodePaths); + pkg.setApplicationVolumeUuid(pkg.volumeUuid); + pkg.setApplicationInfoCodePath(pkg.codePath); + pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths); + pkg.setApplicationInfoResourcePath(pkg.codePath); + pkg.setApplicationInfoBaseResourcePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths); return true; } @@ -12035,20 +12346,20 @@ public class PackageManagerService extends IPackageManager.Stub { final File afterCodeFile = new File(packagePath); // Reflect the rename in scanned details - pkg.codePath = afterCodeFile.getAbsolutePath(); - pkg.baseCodePath = FileUtils.rewriteAfterRename(beforeCodeFile, afterCodeFile, - pkg.baseCodePath); - pkg.splitCodePaths = FileUtils.rewriteAfterRename(beforeCodeFile, afterCodeFile, - pkg.splitCodePaths); + pkg.setCodePath(afterCodeFile.getAbsolutePath()); + pkg.setBaseCodePath(FileUtils.rewriteAfterRename(beforeCodeFile, + afterCodeFile, pkg.baseCodePath)); + pkg.setSplitCodePaths(FileUtils.rewriteAfterRename(beforeCodeFile, + afterCodeFile, pkg.splitCodePaths)); // Reflect the rename in app info - pkg.applicationInfo.volumeUuid = pkg.volumeUuid; - pkg.applicationInfo.setCodePath(pkg.codePath); - pkg.applicationInfo.setBaseCodePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitCodePaths(pkg.splitCodePaths); - pkg.applicationInfo.setResourcePath(pkg.codePath); - pkg.applicationInfo.setBaseResourcePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitResourcePaths(pkg.splitCodePaths); + pkg.setApplicationVolumeUuid(pkg.volumeUuid); + pkg.setApplicationInfoCodePath(pkg.codePath); + pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths); + pkg.setApplicationInfoResourcePath(pkg.codePath); + pkg.setApplicationInfoBaseResourcePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths); return true; } @@ -12227,13 +12538,13 @@ public class PackageManagerService extends IPackageManager.Stub { } // Reflect the move in app info - pkg.applicationInfo.volumeUuid = pkg.volumeUuid; - pkg.applicationInfo.setCodePath(pkg.codePath); - pkg.applicationInfo.setBaseCodePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitCodePaths(pkg.splitCodePaths); - pkg.applicationInfo.setResourcePath(pkg.codePath); - pkg.applicationInfo.setBaseResourcePath(pkg.baseCodePath); - pkg.applicationInfo.setSplitResourcePaths(pkg.splitCodePaths); + pkg.setApplicationVolumeUuid(pkg.volumeUuid); + pkg.setApplicationInfoCodePath(pkg.codePath); + pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths); + pkg.setApplicationInfoResourcePath(pkg.codePath); + pkg.setApplicationInfoBaseResourcePath(pkg.baseCodePath); + pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths); return true; } @@ -12427,7 +12738,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.Package newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags, System.currentTimeMillis(), user); - updateSettingsLI(newPackage, installerPackageName, volumeUuid, null, null, res, user); + updateSettingsLI(newPackage, installerPackageName, null, null, res, user); prepareAppDataAfterInstall(newPackage); // delete the partially installed application. the data directory will have to be @@ -12439,7 +12750,7 @@ public class PackageManagerService extends IPackageManager.Stub { // install. deletePackageLI(pkgName, UserHandle.ALL, false, null, null, dataDirExists ? PackageManager.DELETE_KEEP_DATA : 0, - res.removedInfo, true); + res.removedInfo, true, null); } } catch (PackageManagerException e) { @@ -12508,16 +12819,16 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_INSTALL) Slog.d(TAG, "replacePackageLI: new=" + pkg + ", old=" + oldPackage); final PackageSetting ps = mSettings.mPackages.get(pkgName); if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) { - if(!checkUpgradeKeySetLP(ps, pkg)) { + if (!checkUpgradeKeySetLP(ps, pkg)) { res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE, "New package not signed by keys specified by upgrade-keysets: " - + pkgName); + + pkgName); return; } } else { // default to original signature matching if (compareSignatures(oldPackage.mSignatures, pkg.mSignatures) - != PackageManager.SIGNATURE_MATCH) { + != PackageManager.SIGNATURE_MATCH) { res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE, "New package has a different signature: " + pkgName); return; @@ -12535,33 +12846,30 @@ public class PackageManagerService extends IPackageManager.Stub { boolean sysPkg = (isSystemApp(oldPackage)); if (sysPkg) { replaceSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); + user, allUsers, perUserInstalled, installerPackageName, res); } else { replaceNonSystemPackageLI(oldPackage, pkg, parseFlags, scanFlags, - user, allUsers, perUserInstalled, installerPackageName, volumeUuid, res); + user, allUsers, perUserInstalled, installerPackageName, res); } } private void replaceNonSystemPackageLI(PackageParser.Package deletedPackage, PackageParser.Package pkg, int parseFlags, int scanFlags, UserHandle user, int[] allUsers, boolean[] perUserInstalled, String installerPackageName, - String volumeUuid, PackageInstalledInfo res) { + PackageInstalledInfo res) { + if (DEBUG_INSTALL) Slog.d(TAG, "replaceNonSystemPackageLI: new=" + pkg + ", old=" + + deletedPackage); + String pkgName = deletedPackage.packageName; boolean deletedPkg = true; - boolean updatedSettings = false; + boolean addedPkg = false; - if (DEBUG_INSTALL) Slog.d(TAG, "replaceNonSystemPackageLI: new=" + pkg + ", old=" - + deletedPackage); - long origUpdateTime; - if (pkg.mExtras != null) { - origUpdateTime = ((PackageSetting)pkg.mExtras).lastUpdateTime; - } else { - origUpdateTime = 0; - } + final long origUpdateTime = (pkg.mExtras != null) + ? ((PackageSetting)pkg.mExtras).lastUpdateTime : 0; // First delete the existing package while retaining the data directory if (!deletePackageLI(pkgName, null, true, null, null, PackageManager.DELETE_KEEP_DATA, - res.removedInfo, true)) { + res.removedInfo, true, pkg)) { // If the existing package wasn't successfully deleted res.setError(INSTALL_FAILED_REPLACE_COULDNT_DELETE, "replaceNonSystemPackageLI"); deletedPkg = false; @@ -12580,33 +12888,30 @@ public class PackageManagerService extends IPackageManager.Stub { sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null); } - deleteCodeCacheDirsLI(pkg.volumeUuid, pkgName); + deleteCodeCacheDirsLI(pkg); + try { final PackageParser.Package newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags | SCAN_UPDATE_TIME, System.currentTimeMillis(), user); - updateSettingsLI(newPackage, installerPackageName, volumeUuid, allUsers, + updateSettingsLI(newPackage, installerPackageName, allUsers, perUserInstalled, res, user); prepareAppDataAfterInstall(newPackage); - updatedSettings = true; + addedPkg = true; } catch (PackageManagerException e) { res.setError("Package couldn't be installed in " + pkg.codePath, e); } } if (res.returnCode != PackageManager.INSTALL_SUCCEEDED) { - // remove package from internal structures. Note that we want deletePackageX to - // delete the package data and cache directories that it created in - // scanPackageLocked, unless those directories existed before we even tried to - // install. - if(updatedSettings) { - if (DEBUG_INSTALL) Slog.d(TAG, "Install failed, rolling pack: " + pkgName); - deletePackageLI( - pkgName, null, true, allUsers, perUserInstalled, - PackageManager.DELETE_KEEP_DATA, - res.removedInfo, true); - } - // Since we failed to install the new package we need to restore the old - // package that we deleted. + if (DEBUG_INSTALL) Slog.d(TAG, "Install failed, rolling pack: " + pkgName); + + // Revert all internal state mutations and added folders for the failed install + if (addedPkg) { + deletePackageLI(pkgName, null, true, allUsers, perUserInstalled, + PackageManager.DELETE_KEEP_DATA, res.removedInfo, true, null); + } + + // Restore the old package if (deletedPkg) { if (DEBUG_INSTALL) Slog.d(TAG, "Install failed, reinstalling: " + deletedPackage); File restoreFile = new File(deletedPackage.codePath); @@ -12624,14 +12929,17 @@ public class PackageManagerService extends IPackageManager.Stub { + e.getMessage()); return; } - // Restore of old package succeeded. Update permissions. - // writer + synchronized (mPackages) { - updatePermissionsLPw(deletedPackage.packageName, deletedPackage, - UPDATE_PERMISSIONS_ALL); - // can downgrade to reader + // Ensure the installer package name up to date + setInstallerPackageNameLPw(deletedPackage, installerPackageName); + + // Update permissions for restored package + updatePermissionsLPw(deletedPackage, UPDATE_PERMISSIONS_ALL); + mSettings.writeLPr(); } + Slog.i(TAG, "Successfully restored package : " + pkgName + " after failed upgrade"); } } @@ -12640,89 +12948,100 @@ public class PackageManagerService extends IPackageManager.Stub { private void replaceSystemPackageLI(PackageParser.Package deletedPackage, PackageParser.Package pkg, int parseFlags, int scanFlags, UserHandle user, int[] allUsers, boolean[] perUserInstalled, String installerPackageName, - String volumeUuid, PackageInstalledInfo res) { + PackageInstalledInfo res) { if (DEBUG_INSTALL) Slog.d(TAG, "replaceSystemPackageLI: new=" + pkg + ", old=" + deletedPackage); - boolean disabledSystem = false; - boolean updatedSettings = false; + + final boolean disabledSystem; + + // Set the system/privileged flags as needed parseFlags |= PackageParser.PARSE_IS_SYSTEM; - if ((deletedPackage.applicationInfo.privateFlags&ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) + if ((deletedPackage.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; } - String packageName = deletedPackage.packageName; - if (packageName == null) { - res.setError(INSTALL_FAILED_REPLACE_COULDNT_DELETE, - "Attempt to delete null packageName."); - return; - } - PackageParser.Package oldPkg; - PackageSetting oldPkgSetting; - // reader - synchronized (mPackages) { - oldPkg = mPackages.get(packageName); - oldPkgSetting = mSettings.mPackages.get(packageName); - if((oldPkg == null) || (oldPkg.applicationInfo == null) || - (oldPkgSetting == null)) { - res.setError(INSTALL_FAILED_REPLACE_COULDNT_DELETE, - "Couldn't find package " + packageName + " information"); - return; - } - } - killApplication(packageName, oldPkg.applicationInfo.uid, "replace sys pkg"); + // Kill package processes including services, providers, etc. + killPackage(deletedPackage, "replace sys pkg"); + + // Report the result for the parent package only + res.removedInfo.uid = deletedPackage.applicationInfo.uid; + res.removedInfo.removedPackage = deletedPackage.packageName; - res.removedInfo.uid = oldPkg.applicationInfo.uid; - res.removedInfo.removedPackage = packageName; // Remove existing system package - removePackageLI(oldPkgSetting, true); - // writer - synchronized (mPackages) { - disabledSystem = mSettings.disableSystemPackageLPw(packageName); - if (!disabledSystem && deletedPackage != null) { - // We didn't need to disable the .apk as a current system package, - // which means we are replacing another update that is already - // installed. We need to make sure to delete the older one's .apk. - res.removedInfo.args = createInstallArgsForExisting(0, - deletedPackage.applicationInfo.getCodePath(), - deletedPackage.applicationInfo.getResourcePath(), - getAppDexInstructionSets(deletedPackage.applicationInfo)); - } else { - res.removedInfo.args = null; - } + removePackageSettingLI(deletedPackage, true); + + disabledSystem = disableSystemPackageLPw(deletedPackage, pkg); + if (!disabledSystem) { + // We didn't need to disable the .apk as a current system package, + // which means we are replacing another update that is already + // installed. We need to make sure to delete the older one's .apk. + res.removedInfo.args = createInstallArgsForExisting(0, + deletedPackage.applicationInfo.getCodePath(), + deletedPackage.applicationInfo.getResourcePath(), + getAppDexInstructionSets(deletedPackage.applicationInfo)); + } else { + res.removedInfo.args = null; } // Successfully disabled the old package. Now proceed with re-installation - deleteCodeCacheDirsLI(pkg.volumeUuid, packageName); + deleteCodeCacheDirsLI(pkg); res.returnCode = PackageManager.INSTALL_SUCCEEDED; - pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; + pkg.setApplicationInfoFlags(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, + ApplicationInfo.FLAG_UPDATED_SYSTEM_APP); PackageParser.Package newPackage = null; try { + // Add the package to the internal data structures newPackage = scanPackageTracedLI(pkg, parseFlags, scanFlags, 0, user); - if (newPackage.mExtras != null) { - final PackageSetting newPkgSetting = (PackageSetting) newPackage.mExtras; - newPkgSetting.firstInstallTime = oldPkgSetting.firstInstallTime; - newPkgSetting.lastUpdateTime = System.currentTimeMillis(); - // is the update attempting to change shared user? that isn't going to work... - if (oldPkgSetting.sharedUser != newPkgSetting.sharedUser) { - res.setError(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, - "Forbidding shared user change from " + oldPkgSetting.sharedUser - + " to " + newPkgSetting.sharedUser); - updatedSettings = true; - } + // Set the update and install times + PackageSetting deletedPkgSetting = (PackageSetting) deletedPackage.mExtras; + setInstallAndUpdateTime(newPackage, deletedPkgSetting.firstInstallTime, + System.currentTimeMillis()); + + // Check for shared user id changes + String invalidPackageName = getParentOrChildPackageChangedSharedUser(deletedPackage, newPackage); + if (invalidPackageName != null) { + res.setError(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, + "Forbidding shared user change from " + deletedPkgSetting.sharedUser + + " to " + invalidPackageName); } + // Update the package dynamic state if succeeded if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) { - updateSettingsLI(newPackage, installerPackageName, volumeUuid, allUsers, + // Now that the install succeeded make sure we remove data + // directories for any child package the update removed. + final int deletedChildCount = (deletedPackage.childPackages != null) + ? deletedPackage.childPackages.size() : 0; + final int newChildCount = (newPackage.childPackages != null) + ? newPackage.childPackages.size() : 0; + for (int i = 0; i < deletedChildCount; i++) { + PackageParser.Package deletedChildPkg = deletedPackage.childPackages.get(i); + boolean childPackageDeleted = true; + for (int j = 0; j < newChildCount; j++) { + PackageParser.Package newChildPkg = newPackage.childPackages.get(j); + if (deletedChildPkg.packageName.equals(newChildPkg.packageName)) { + childPackageDeleted = false; + break; + } + } + if (childPackageDeleted) { + PackageSetting ps = mSettings.getDisabledSystemPkgLPr( + deletedChildPkg.packageName); + if (ps != null) { + removePackageDataLI(ps, allUsers, perUserInstalled, null, 0, false); + } + } + } + + updateSettingsLI(newPackage, installerPackageName, allUsers, perUserInstalled, res, user); prepareAppDataAfterInstall(newPackage); - updatedSettings = true; } - } catch (PackageManagerException e) { + res.returnCode = INSTALL_FAILED_INTERNAL_ERROR; res.setError("Package couldn't be installed in " + pkg.codePath, e); } @@ -12734,21 +13053,111 @@ public class PackageManagerService extends IPackageManager.Stub { } // Add back the old system package try { - scanPackageTracedLI(oldPkg, parseFlags, SCAN_UPDATE_SIGNATURE, 0, user); + scanPackageTracedLI(deletedPackage, parseFlags, SCAN_UPDATE_SIGNATURE, 0, user); } catch (PackageManagerException e) { Slog.e(TAG, "Failed to restore original package: " + e.getMessage()); } - // Restore the old system information in Settings + synchronized (mPackages) { if (disabledSystem) { - mSettings.enableSystemPackageLPw(packageName); - } - if (updatedSettings) { - mSettings.setInstallerPackageName(packageName, - oldPkgSetting.installerPackageName); + enableSystemPackageLPw(deletedPackage); } + + // Ensure the installer package name up to date + setInstallerPackageNameLPw(deletedPackage, installerPackageName); + + // Update permissions for restored package + updatePermissionsLPw(deletedPackage, UPDATE_PERMISSIONS_ALL); + mSettings.writeLPr(); } + + Slog.i(TAG, "Successfully restored package : " + deletedPackage.packageName + + " after failed upgrade"); + } + } + + /** + * Checks whether the parent or any of the child packages have a change shared + * user. For a package to be a valid update the shred users of the parent and + * the children should match. We may later support changing child shared users. + * @param oldPkg The updated package. + * @param newPkg The update package. + * @return The shared user that change between the versions. + */ + private String getParentOrChildPackageChangedSharedUser(PackageParser.Package oldPkg, + PackageParser.Package newPkg) { + // Check parent shared user + if (!Objects.equals(oldPkg.mSharedUserId, newPkg.mSharedUserId)) { + return newPkg.packageName; + } + // Check child shared users + final int oldChildCount = (oldPkg.childPackages != null) ? oldPkg.childPackages.size() : 0; + final int newChildCount = (newPkg.childPackages != null) ? newPkg.childPackages.size() : 0; + for (int i = 0; i < newChildCount; i++) { + PackageParser.Package newChildPkg = newPkg.childPackages.get(i); + // If this child was present, did it have the same shared user? + for (int j = 0; j < oldChildCount; j++) { + PackageParser.Package oldChildPkg = oldPkg.childPackages.get(j); + if (newChildPkg.packageName.equals(oldChildPkg.packageName) + && !Objects.equals(newChildPkg.mSharedUserId, oldChildPkg.mSharedUserId)) { + return newChildPkg.packageName; + } + } + } + return null; + } + + private void removeNativeBinariesLI(PackageParser.Package pkg) { + // Remove the lib path for the parent package + PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps != null) { + NativeLibraryHelper.removeNativeBinariesLI(ps.legacyNativeLibraryPathString); + } + // Remove the lib path for the child packages + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + ps = (PackageSetting) pkg.childPackages.get(i).mExtras; + if (ps != null) { + NativeLibraryHelper.removeNativeBinariesLI(ps.legacyNativeLibraryPathString); + } + } + } + + private void enableSystemPackageLPw(PackageParser.Package pkg) { + // Enable the parent package + mSettings.enableSystemPackageLPw(pkg.packageName); + // Enable the child packages + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + mSettings.enableSystemPackageLPw(childPkg.packageName); + } + } + + private boolean disableSystemPackageLPw(PackageParser.Package oldPkg, + PackageParser.Package newPkg) { + // Disable the parent package (parent always replaced) + boolean disabled = mSettings.disableSystemPackageLPw(oldPkg.packageName, true); + // Disable the child packages + final int childCount = (oldPkg.childPackages != null) ? oldPkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = oldPkg.childPackages.get(i); + final boolean replace = newPkg.hasChildPackage(childPkg.packageName); + disabled |= mSettings.disableSystemPackageLPw(childPkg.packageName, replace); + } + return disabled; + } + + private void setInstallerPackageNameLPw(PackageParser.Package pkg, + String installerPackageName) { + // Enable the parent package + mSettings.setInstallerPackageName(pkg.packageName, installerPackageName); + // Enable the child packages + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = pkg.childPackages.get(i); + mSettings.setInstallerPackageName(childPkg.packageName, installerPackageName); } } @@ -12813,8 +13222,23 @@ public class PackageManagerService extends IPackageManager.Stub { } private void updateSettingsLI(PackageParser.Package newPackage, String installerPackageName, - String volumeUuid, int[] allUsers, boolean[] perUserInstalled, PackageInstalledInfo res, - UserHandle user) { + int[] allUsers, boolean[] perUserInstalled, PackageInstalledInfo res, UserHandle user) { + // Update the parent package setting + updateSettingsInternalLI(newPackage, installerPackageName, allUsers, perUserInstalled, + res, user); + // Update the child packages setting + final int childCount = (newPackage.childPackages != null) + ? newPackage.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPackage = newPackage.childPackages.get(i); + updateSettingsInternalLI(childPackage, installerPackageName, allUsers, perUserInstalled, + res, user); + } + } + + private void updateSettingsInternalLI(PackageParser.Package newPackage, + String installerPackageName, int[] allUsers, boolean[] perUserInstalled, + PackageInstalledInfo res, UserHandle user) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "updateSettings"); String pkgName = newPackage.packageName; @@ -12959,7 +13383,7 @@ public class PackageManagerService extends IPackageManager.Stub { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); try { - pp.collectCertificates(pkg, parseFlags); + PackageParser.collectCertificates(pkg, parseFlags); } catch (PackageParserException e) { res.setError("Failed collect during installPackageLI", e); return; @@ -12994,8 +13418,17 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_INSTALL) Slog.d(TAG, "Replace existing pacakge: " + pkgName); } - // Prevent apps opting out from runtime permissions + // Child packages are installed through the parent package + if (pkg.parentPackage != null) { + res.setError(PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME, + "Package " + pkg.packageName + " is child of package " + + pkg.parentPackage.parentPackage + ". Child packages " + + "can be updated only through the parent package."); + return; + } + if (replace) { + // Prevent apps opting out from runtime permissions PackageParser.Package oldPackage = mPackages.get(pkgName); final int oldTargetSdk = oldPackage.applicationInfo.targetSdkVersion; final int newTargetSdk = pkg.applicationInfo.targetSdkVersion; @@ -13007,6 +13440,15 @@ public class PackageManagerService extends IPackageManager.Stub { + " target SDK " + oldTargetSdk + " does."); return; } + + // Prevent installing of child packages + if (oldPackage.parentPackage != null) { + res.setError(PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME, + "Package " + pkg.packageName + " is child of package " + + oldPackage.parentPackage + ". Child packages " + + "can be updated only through the parent package."); + return; + } } } @@ -13080,7 +13522,6 @@ public class PackageManagerService extends IPackageManager.Stub { } } } - } if (systemApp) { @@ -13526,9 +13967,8 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mInstallLock) { if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageX: pkg=" + packageName + " user=" + userId); - res = deletePackageLI(packageName, removeForUser, - true, allUsers, perUserInstalled, - flags | REMOVE_CHATTY, info, true); + res = deletePackageLI(packageName, removeForUser, true, allUsers, perUserInstalled, + flags | REMOVE_CHATTY, info, true, null); systemUpdate = info.isRemovedPackageSystemUpdate; synchronized (mPackages) { if (res) { @@ -13617,7 +14057,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageRemovedInfo outInfo, int flags, boolean writeSettings) { String packageName = ps.name; if (DEBUG_REMOVE) Slog.d(TAG, "removePackageDataLI: " + ps); - removePackageLI(ps, (flags&REMOVE_CHATTY) != 0); + removePackageSettingLI(ps, (flags&REMOVE_CHATTY) != 0); // Retrieve object to delete permissions for shared user later on final PackageSetting deletedPs; // reader @@ -13713,27 +14153,36 @@ public class PackageManagerService extends IPackageManager.Stub { /* * Tries to delete system package. */ - private boolean deleteSystemPackageLI(PackageSetting newPs, - int[] allUserHandles, boolean[] perUserInstalled, - int flags, PackageRemovedInfo outInfo, boolean writeSettings) { + private boolean deleteSystemPackageLI(PackageParser.Package deletedPkg, + PackageSetting deletedPs, int[] allUserHandles, boolean[] perUserInstalled, + int flags, PackageRemovedInfo outInfo, boolean writeSettings, + PackageParser.Package replacingPackage) { + if (deletedPkg.parentPackage != null) { + Slog.w(TAG, "Attempt to delete child system package " + deletedPkg.packageName); + return false; + } + final boolean applyUserRestrictions = (allUserHandles != null) && (perUserInstalled != null); - PackageSetting disabledPs = null; + final PackageSetting disabledPs; // Confirm if the system package has been updated // An updated system app can be deleted. This will also have to restore // the system pkg from system partition // reader synchronized (mPackages) { - disabledPs = mSettings.getDisabledSystemPkgLPr(newPs.name); + disabledPs = mSettings.getDisabledSystemPkgLPr(deletedPkg.packageName); } - if (DEBUG_REMOVE) Slog.d(TAG, "deleteSystemPackageLI: newPs=" + newPs + + if (DEBUG_REMOVE) Slog.d(TAG, "deleteSystemPackageLI: newPs=" + deletedPkg.packageName + " disabledPs=" + disabledPs); + if (disabledPs == null) { - Slog.w(TAG, "Attempt to delete unknown system package "+ newPs.name); + Slog.w(TAG, "Attempt to delete unknown system package "+ deletedPkg.packageName); return false; } else if (DEBUG_REMOVE) { Slog.d(TAG, "Deleting system pkg from data partition"); } + if (DEBUG_REMOVE) { if (applyUserRestrictions) { Slog.d(TAG, "Remembering install states:"); @@ -13742,27 +14191,30 @@ public class PackageManagerService extends IPackageManager.Stub { } } } + // Delete the updated package outInfo.isRemovedPackageSystemUpdate = true; - if (disabledPs.versionCode < newPs.versionCode) { + if (disabledPs.versionCode < deletedPs.versionCode) { // Delete data for downgrades flags &= ~PackageManager.DELETE_KEEP_DATA; } else { // Preserve data by setting flag flags |= PackageManager.DELETE_KEEP_DATA; } - boolean ret = deleteInstalledPackageLI(newPs, true, flags, - allUserHandles, perUserInstalled, outInfo, writeSettings); + boolean ret = deleteInstalledPackageLI(deletedPkg, true, flags, allUserHandles, + perUserInstalled, outInfo, writeSettings, replacingPackage); if (!ret) { return false; } + // writer synchronized (mPackages) { // Reinstate the old system package - mSettings.enableSystemPackageLPw(newPs.name); + enableSystemPackageLPw(disabledPs.pkg); // Remove any native libraries from the upgraded package. - NativeLibraryHelper.removeNativeBinariesLI(newPs.legacyNativeLibraryPathString); + removeNativeBinariesLI(deletedPkg); } + // Install the system package if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); int parseFlags = PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM; @@ -13774,7 +14226,8 @@ public class PackageManagerService extends IPackageManager.Stub { try { newPkg = scanPackageTracedLI(disabledPs.codePath, parseFlags, SCAN_NO_PATHS, 0, null); } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to restore system package " + newPs.name + ": " + e.getMessage()); + Slog.w(TAG, "Failed to restore system package:" + deletedPkg.packageName + ": " + + e.getMessage()); return false; } @@ -13787,7 +14240,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Propagate the permissions state as we do not want to drop on the floor // runtime permissions. The update permissions method below will take // care of removing obsolete permissions and grant install permissions. - ps.getPermissionsState().copyFrom(newPs.getPermissionsState()); + ps.getPermissionsState().copyFrom(deletedPs.getPermissionsState()); updatePermissionsLPw(newPkg.packageName, newPkg, UPDATE_PERMISSIONS_ALL | UPDATE_PERMISSIONS_REPLACE_PKG); @@ -13816,23 +14269,58 @@ public class PackageManagerService extends IPackageManager.Stub { return true; } - private boolean deleteInstalledPackageLI(PackageSetting ps, - boolean deleteCodeAndResources, int flags, - int[] allUserHandles, boolean[] perUserInstalled, - PackageRemovedInfo outInfo, boolean writeSettings) { - if (outInfo != null) { - outInfo.uid = ps.appId; + private boolean deleteInstalledPackageLI(PackageParser.Package pkg, + boolean deleteCodeAndResources, int flags, int[] allUserHandles, + boolean[] perUserInstalled, PackageRemovedInfo outInfo, boolean writeSettings, + PackageParser.Package replacingPackage) { + PackageSetting ps = null; + + synchronized (mPackages) { + pkg = mPackages.get(pkg.packageName); + if (pkg == null) { + return false; + } + + ps = mSettings.mPackages.get(pkg.packageName); + if (ps == null) { + return false; + } + + if (outInfo != null) { + outInfo.uid = ps.appId; + } } // Delete package data from internal structures and also remove data if flag is set - removePackageDataLI(ps, allUserHandles, perUserInstalled, outInfo, flags, writeSettings); + removePackageDataLI(ps, allUserHandles, perUserInstalled, outInfo, flags, + writeSettings); - // Delete application code and resources - if (deleteCodeAndResources && (outInfo != null)) { - outInfo.args = createInstallArgsForExisting(packageFlagsToInstallFlags(ps), - ps.codePathString, ps.resourcePathString, getAppDexInstructionSets(ps)); - if (DEBUG_SD_INSTALL) Slog.i(TAG, "args=" + outInfo.args); + // Delete the child packages data + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageSetting childPs; + synchronized (mPackages) { + childPs = mSettings.peekPackageLPr(pkg.childPackages.get(i).packageName); + } + if (childPs != null) { + final int deleteFlags = (flags & DELETE_KEEP_DATA) != 0 + && (replacingPackage != null + && !replacingPackage.hasChildPackage(childPs.name)) + ? flags & ~DELETE_KEEP_DATA : flags; + removePackageDataLI(childPs, allUserHandles, perUserInstalled, outInfo, + deleteFlags, writeSettings); + } } + + // Delete application code and resources only for parent packages + if (ps.pkg.parentPackage == null) { + if (deleteCodeAndResources && (outInfo != null)) { + outInfo.args = createInstallArgsForExisting(packageFlagsToInstallFlags(ps), + ps.codePathString, ps.resourcePathString, getAppDexInstructionSets(ps)); + if (DEBUG_SD_INSTALL) Slog.i(TAG, "args=" + outInfo.args); + } + } + return true; } @@ -13898,105 +14386,80 @@ public class PackageManagerService extends IPackageManager.Stub { */ private boolean deletePackageLI(String packageName, UserHandle user, boolean deleteCodeAndResources, int[] allUserHandles, boolean[] perUserInstalled, - int flags, PackageRemovedInfo outInfo, - boolean writeSettings) { + int flags, PackageRemovedInfo outInfo, boolean writeSettings, + PackageParser.Package replacingPackage) { if (packageName == null) { Slog.w(TAG, "Attempt to delete null packageName."); return false; } + if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageLI: " + packageName + " user " + user); + PackageSetting ps; - boolean dataOnly = false; int removeUser = -1; - int appId = -1; + synchronized (mPackages) { ps = mSettings.mPackages.get(packageName); if (ps == null) { Slog.w(TAG, "Package named '" + packageName + "' doesn't exist."); return false; } - if ((!isSystemApp(ps) || (flags&PackageManager.DELETE_SYSTEM_APP) != 0) && user != null - && user.getIdentifier() != UserHandle.USER_ALL) { - // The caller is asking that the package only be deleted for a single - // user. To do this, we just mark its uninstalled state and delete - // its data. If this is a system app, we only allow this to happen if - // they have set the special DELETE_SYSTEM_APP which requests different - // semantics than normal for uninstalling system apps. - if (DEBUG_REMOVE) Slog.d(TAG, "Only deleting for single user"); - final int userId = user.getIdentifier(); - ps.setUserState(userId, - COMPONENT_ENABLED_STATE_DEFAULT, - false, //installed - true, //stopped - true, //notLaunched - false, //hidden - false, //suspended - null, null, null, - false, // blockUninstall - ps.readUserState(userId).domainVerificationStatus, 0); - if (!isSystemApp(ps)) { - // Do not uninstall the APK if an app should be cached - boolean keepUninstalledPackage = shouldKeepUninstalledPackageLPr(packageName); - if (ps.isAnyInstalled(sUserManager.getUserIds()) || keepUninstalledPackage) { - // Other user still have this package installed, so all - // we need to do is clear this user's data and save that - // it is uninstalled. - if (DEBUG_REMOVE) Slog.d(TAG, "Still installed by other users"); - removeUser = user.getIdentifier(); - appId = ps.appId; - scheduleWritePackageRestrictionsLocked(removeUser); - } else { - // We need to set it back to 'installed' so the uninstall - // broadcasts will be sent correctly. - if (DEBUG_REMOVE) Slog.d(TAG, "Not installed by other users, full delete"); - ps.setInstalled(true, user.getIdentifier()); - } - } else { - // This is a system app, so we assume that the - // other users still have this package installed, so all - // we need to do is clear this user's data and save that - // it is uninstalled. - if (DEBUG_REMOVE) Slog.d(TAG, "Deleting system app"); - removeUser = user.getIdentifier(); - appId = ps.appId; - scheduleWritePackageRestrictionsLocked(removeUser); + + if (ps.pkg.parentPackage != null && (!isSystemApp(ps) + || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)) { + if (DEBUG_REMOVE) { + Slog.d(TAG, "Uninstalled child package:" + packageName + " for user:" + + ((user == null) ? UserHandle.USER_ALL : user)); + } + if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + return false; } + markPackageUninstalledForUserLPw(ps, user); + scheduleWritePackageRestrictionsLocked(user); + return true; } } - if (removeUser >= 0) { - // From above, we determined that we are deleting this only - // for a single user. Continue the work here. - if (DEBUG_REMOVE) Slog.d(TAG, "Updating install state for user: " + removeUser); - if (outInfo != null) { - outInfo.removedPackage = packageName; - outInfo.removedAppId = appId; - outInfo.removedUsers = new int[] {removeUser}; - } - // TODO: triage flags as part of 26466827 - final int installerFlags = StorageManager.FLAG_STORAGE_CE - | StorageManager.FLAG_STORAGE_DE; - try { - mInstaller.destroyAppData(ps.volumeUuid, packageName, removeUser, installerFlags); - } catch (InstallerException e) { - Slog.w(TAG, "Failed to delete app data", e); - } - removeKeystoreDataIfNeeded(removeUser, appId); - schedulePackageCleaning(packageName, removeUser, false); - synchronized (mPackages) { - if (clearPackagePreferredActivitiesLPw(packageName, removeUser)) { - scheduleWritePackageRestrictionsLocked(removeUser); + if (((!isSystemApp(ps) || (flags&PackageManager.DELETE_SYSTEM_APP) != 0) && user != null + && user.getIdentifier() != UserHandle.USER_ALL)) { + // The caller is asking that the package only be deleted for a single + // user. To do this, we just mark its uninstalled state and delete + // its data. If this is a system app, we only allow this to happen if + // they have set the special DELETE_SYSTEM_APP which requests different + // semantics than normal for uninstalling system apps. + markPackageUninstalledForUserLPw(ps, user); + + if (!isSystemApp(ps)) { + // Do not uninstall the APK if an app should be cached + boolean keepUninstalledPackage = shouldKeepUninstalledPackageLPr(packageName); + if (ps.isAnyInstalled(sUserManager.getUserIds()) || keepUninstalledPackage) { + // Other user still have this package installed, so all + // we need to do is clear this user's data and save that + // it is uninstalled. + if (DEBUG_REMOVE) Slog.d(TAG, "Still installed by other users"); + if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + return false; + } + scheduleWritePackageRestrictionsLocked(user); + return true; + } else { + // We need to set it back to 'installed' so the uninstall + // broadcasts will be sent correctly. + if (DEBUG_REMOVE) Slog.d(TAG, "Not installed by other users, full delete"); + ps.setInstalled(true, user.getIdentifier()); } - resetUserChangesToRuntimePermissionsAndFlagsLPw(ps, removeUser); + } else { + // This is a system app, so we assume that the + // other users still have this package installed, so all + // we need to do is clear this user's data and save that + // it is uninstalled. + if (DEBUG_REMOVE) Slog.d(TAG, "Deleting system app"); + if (!clearPackageStateForUser(ps, removeUser, outInfo)) { + return false; + } + scheduleWritePackageRestrictionsLocked(user); + return true; } - return true; - } - - if (dataOnly) { - // Delete application data first - if (DEBUG_REMOVE) Slog.d(TAG, "Removing package data only"); - removePackageDataLI(ps, null, null, outInfo, flags, writeSettings); - return true; } boolean ret = false; @@ -14004,21 +14467,70 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.name); // When an updated system application is deleted we delete the existing resources as well and // fall back to existing code in system partition - ret = deleteSystemPackageLI(ps, allUserHandles, perUserInstalled, - flags, outInfo, writeSettings); + ret = deleteSystemPackageLI(ps.pkg, ps, allUserHandles, perUserInstalled, + flags, outInfo, writeSettings, replacingPackage); } else { if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.name); // Kill application pre-emptively especially for apps on sd. killApplication(packageName, ps.appId, "uninstall pkg"); - ret = deleteInstalledPackageLI(ps, deleteCodeAndResources, flags, - allUserHandles, perUserInstalled, - outInfo, writeSettings); + ret = deleteInstalledPackageLI(ps.pkg, deleteCodeAndResources, flags, allUserHandles, + perUserInstalled, outInfo, writeSettings, replacingPackage); } return ret; } - private final static class ClearStorageConnection implements ServiceConnection { + private void markPackageUninstalledForUserLPw(PackageSetting ps, UserHandle user) { + final int[] userIds = (user == null || user.getIdentifier() == UserHandle.USER_ALL) + ? sUserManager.getUserIds() : new int[] {user.getIdentifier()}; + for (int nextUserId : userIds) { + if (DEBUG_REMOVE) { + Slog.d(TAG, "Marking package:" + ps.name + " uninstalled for user:" + nextUserId); + } + ps.setUserState(nextUserId, COMPONENT_ENABLED_STATE_DEFAULT, + false /*installed*/, true /*stopped*/, true /*notLaunched*/, + false /*hidden*/, false /*suspended*/, null, null, null, + false /*blockUninstall*/, + ps.readUserState(nextUserId).domainVerificationStatus, 0); + } + } + + private boolean clearPackageStateForUser(PackageSetting ps, int userId, + PackageRemovedInfo outInfo) { + final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds() + : new int[] {userId}; + for (int nextUserId : userIds) { + if (DEBUG_REMOVE) { + Slog.d(TAG, "Updating package:" + ps.name + " install state for user:" + + nextUserId); + } + final int flags = StorageManager.FLAG_STORAGE_CE| StorageManager.FLAG_STORAGE_DE; + try { + mInstaller.destroyAppData(ps.volumeUuid, ps.name, nextUserId, flags); + } catch (InstallerException e) { + Slog.w(TAG, "Couldn't remove cache files for package " + ps.name, e); + return false; + } + removeKeystoreDataIfNeeded(nextUserId, ps.appId); + schedulePackageCleaning(ps.name, nextUserId, false); + synchronized (mPackages) { + if (clearPackagePreferredActivitiesLPw(ps.name, nextUserId)) { + scheduleWritePackageRestrictionsLocked(nextUserId); + } + resetUserChangesToRuntimePermissionsAndFlagsLPw(ps, nextUserId); + } + } + + if (outInfo != null) { + outInfo.removedPackage = ps.name; + outInfo.removedAppId = ps.appId; + outInfo.removedUsers = userIds; + } + + return true; + } + + private final class ClearStorageConnection implements ServiceConnection { IMediaContainerService mContainerService; @Override @@ -16708,7 +17220,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); /* * Unload packages mounted on external media. This involves deleting package - * data from internal structures, sending broadcasts about diabled packages, + * data from internal structures, sending broadcasts about disabled packages, * gc'ing to free up references, unmounting all secure containers * corresponding to packages on external media, and posting a * UPDATED_MEDIA_STATUS message if status has been requested. Please note @@ -16730,7 +17242,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); PackageRemovedInfo outInfo = new PackageRemovedInfo(); synchronized (mInstallLock) { boolean res = deletePackageLI(pkgName, null, false, null, null, - PackageManager.DELETE_KEEP_DATA, outInfo, false); + PackageManager.DELETE_KEEP_DATA, outInfo, false, null); if (res) { pkgList.add(pkgName); } else { @@ -16876,7 +17388,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final ApplicationInfo info = ps.pkg.applicationInfo; final PackageRemovedInfo outInfo = new PackageRemovedInfo(); if (deletePackageLI(ps.name, null, false, null, null, - PackageManager.DELETE_KEEP_DATA, outInfo, false)) { + PackageManager.DELETE_KEEP_DATA, outInfo, false, null)) { unloaded.add(info); } else { Slog.w(TAG, "Failed to unload " + ps.codePath); @@ -17121,6 +17633,15 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); * left intact. */ private void prepareAppDataAfterInstall(PackageParser.Package pkg) { + prepareAppDataAfterInstallInternal(pkg); + final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPackage = pkg.childPackages.get(i); + prepareAppDataAfterInstallInternal(childPackage); + } + } + + private void prepareAppDataAfterInstallInternal(PackageParser.Package pkg) { final PackageSetting ps; synchronized (mPackages) { ps = mSettings.mPackages.get(pkg.packageName); diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index f106b62d768b..e3866dfada26 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -21,6 +21,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageParser; import java.io.File; +import java.util.List; /** * Settings data for a particular package we know about. @@ -33,10 +34,11 @@ final class PackageSetting extends PackageSettingBase { PackageSetting(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags, int privateFlags) { + int pVersionCode, int pkgFlags, int privateFlags, String parentPackageName, + List<String> childPackageNames) { super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - pVersionCode, pkgFlags, privateFlags); + pVersionCode, pkgFlags, privateFlags, parentPackageName, childPackageNames); } /** diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index 11179885b6c7..e5eec7efe59a 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -28,6 +28,8 @@ import android.util.ArraySet; import android.util.SparseArray; import java.io.File; +import java.util.ArrayList; +import java.util.List; /** * Settings base class for pending and resolved classes. @@ -49,6 +51,9 @@ abstract class PackageSettingBase extends SettingBase { final String name; final String realName; + String parentPackageName; + List<String> childPackageNames; + /** * Path where this package was found on disk. For monolithic packages * this is path to single base APK file; for cluster packages this is @@ -126,10 +131,14 @@ abstract class PackageSettingBase extends SettingBase { PackageSettingBase(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags, int pkgPrivateFlags) { + int pVersionCode, int pkgFlags, int pkgPrivateFlags, + String parentPackageName, List<String> childPackageNames) { super(pkgFlags, pkgPrivateFlags); this.name = name; this.realName = realName; + this.parentPackageName = parentPackageName; + this.childPackageNames = (childPackageNames != null) + ? new ArrayList<>(childPackageNames) : null; init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode); } @@ -174,6 +183,10 @@ abstract class PackageSettingBase extends SettingBase { volumeUuid = base.volumeUuid; keySetData = new PackageKeySetData(base.keySetData); + + parentPackageName = base.parentPackageName; + childPackageNames = (base.childPackageNames != null) + ? new ArrayList<>(base.childPackageNames) : null; } void init(File codePath, File resourcePath, String legacyNativeLibraryPathString, diff --git a/services/core/java/com/android/server/pm/PackageSignatures.java b/services/core/java/com/android/server/pm/PackageSignatures.java index 9a20be7c8d76..f5c81e4c2ea8 100644 --- a/services/core/java/com/android/server/pm/PackageSignatures.java +++ b/services/core/java/com/android/server/pm/PackageSignatures.java @@ -195,7 +195,7 @@ class PackageSignatures { for (int i=0; i<mSignatures.length; i++) { if (i > 0) buf.append(", "); buf.append(Integer.toHexString( - System.identityHashCode(mSignatures[i]))); + mSignatures[i].hashCode())); } } buf.append("]}"); diff --git a/services/core/java/com/android/server/pm/PendingPackage.java b/services/core/java/com/android/server/pm/PendingPackage.java index bb0dba17fc15..da73085985ba 100644 --- a/services/core/java/com/android/server/pm/PendingPackage.java +++ b/services/core/java/com/android/server/pm/PendingPackage.java @@ -17,6 +17,7 @@ package com.android.server.pm; import java.io.File; +import java.util.List; final class PendingPackage extends PackageSettingBase { final int sharedId; @@ -24,10 +25,11 @@ final class PendingPackage extends PackageSettingBase { PendingPackage(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int sharedId, - int pVersionCode, int pkgFlags, int pkgPrivateFlags) { + int pVersionCode, int pkgFlags, int pkgPrivateFlags, String parentPackageName, + List<String> childPackageNames) { super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - pVersionCode, pkgFlags, pkgPrivateFlags); + pVersionCode, pkgFlags, pkgPrivateFlags, parentPackageName, childPackageNames); this.sharedId = sharedId; } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 8fa5d2410d27..c1a5c5a24978 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -184,6 +184,8 @@ final class Settings { private static final String TAG_SHARED_USER = "shared-user"; private static final String TAG_RUNTIME_PERMISSIONS = "runtime-permissions"; private static final String TAG_PERMISSIONS = "perms"; + private static final String TAG_CHILD_PACKAGE = "child-package"; + private static final String TAG_PERSISTENT_PREFERRED_ACTIVITIES = "persistent-preferred-activities"; static final String TAG_CROSS_PROFILE_INTENT_FILTERS = @@ -416,9 +418,23 @@ final class Settings { String legacyNativeLibraryPathString, String primaryCpuAbi, String secondaryCpuAbi, int pkgFlags, int pkgPrivateFlags, UserHandle user, boolean add) { final String name = pkg.packageName; + final String parentPackageName = (pkg.parentPackage != null) + ? pkg.parentPackage.packageName : null; + + List<String> childPackageNames = null; + if (pkg.childPackages != null) { + final int childCount = pkg.childPackages.size(); + childPackageNames = new ArrayList<>(childCount); + for (int i = 0; i < childCount; i++) { + String childPackageName = pkg.childPackages.get(i).packageName; + childPackageNames.add(childPackageName); + } + } + PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbi, secondaryCpuAbi, - pkg.mVersionCode, pkgFlags, pkgPrivateFlags, user, add, true /* allowInstall */); + pkg.mVersionCode, pkgFlags, pkgPrivateFlags, user, add, true /* allowInstall */, + parentPackageName, childPackageNames); return p; } @@ -503,8 +519,7 @@ final class Settings { return mSharedUsers.values(); } - - boolean disableSystemPackageLPw(String name) { + boolean disableSystemPackageLPw(String name, boolean replaced) { final PackageSetting p = mPackages.get(name); if(p == null) { Log.w(PackageManagerService.TAG, "Package " + name + " is not an installed package"); @@ -512,18 +527,22 @@ final class Settings { } final PackageSetting dp = mDisabledSysPackages.get(name); // always make sure the system package code and resource paths dont change - if (dp == null) { + if (dp == null && p.pkg != null && p.pkg.isSystemApp() && !p.pkg.isUpdatedSystemApp()) { if((p.pkg != null) && (p.pkg.applicationInfo != null)) { p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; } mDisabledSysPackages.put(name, p); - // a little trick... when we install the new package, we don't - // want to modify the existing PackageSetting for the built-in - // version. so at this point we need a new PackageSetting that - // is okay to muck with. - PackageSetting newp = new PackageSetting(p); - replacePackageLPw(name, newp); + if (replaced) { + // a little trick... when we install the new package, we don't + // want to modify the existing PackageSetting for the built-in + // version. so at this point we need a new PackageSetting that + // is okay to muck with. + PackageSetting newp = new PackageSetting(p); + replacePackageLPw(name, newp); + } else { + mPackages.remove(name); + } return true; } return false; @@ -542,7 +561,8 @@ final class Settings { PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, p.legacyNativeLibraryPathString, p.primaryCpuAbiString, p.secondaryCpuAbiString, p.secondaryCpuAbiString, - p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags); + p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags, + p.parentPackageName, p.childPackageNames); mDisabledSysPackages.remove(name); return ret; } @@ -557,7 +577,8 @@ final class Settings { PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, - String cpuAbiOverrideString, int uid, int vc, int pkgFlags, int pkgPrivateFlags) { + String cpuAbiOverrideString, int uid, int vc, int pkgFlags, int pkgPrivateFlags, + String parentPackageName, List<String> childPackageNames) { PackageSetting p = mPackages.get(name); if (p != null) { if (p.appId == uid) { @@ -569,7 +590,8 @@ final class Settings { } p = new PackageSetting(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags); + cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags, parentPackageName, + childPackageNames); p.appId = uid; if (addUserIdLPw(uid, p, name)) { mPackages.put(name, p); @@ -650,7 +672,8 @@ final class Settings { String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, int vc, int pkgFlags, int pkgPrivateFlags, - UserHandle installUser, boolean add, boolean allowInstall) { + UserHandle installUser, boolean add, boolean allowInstall, String parentPackage, + List<String> childPackageNames) { PackageSetting p = mPackages.get(name); UserManagerService userManager = UserManagerService.getInstance(); if (p != null) { @@ -700,7 +723,8 @@ final class Settings { // We are consuming the data from an existing package. p = new PackageSetting(origPackage.name, name, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags); + null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags, + parentPackage, childPackageNames); if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name + " is adopting original package " + origPackage.name); // Note that we will retain the new package's signature so @@ -719,7 +743,8 @@ final class Settings { } else { p = new PackageSetting(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags); + null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags, + parentPackage, childPackageNames); p.setTimeStamp(codePath.lastModified()); p.sharedUser = sharedUser; // If this is not a system app, it starts out stopped. @@ -2049,6 +2074,20 @@ final class Settings { serializer.endTag(null, TAG_PERMISSIONS); } + void writeChildPackagesLPw(XmlSerializer serializer, List<String> childPackageNames) + throws IOException { + if (childPackageNames == null) { + return; + } + final int childCount = childPackageNames.size(); + for (int i = 0; i < childCount; i++) { + String childPackageName = childPackageNames.get(i); + serializer.startTag(null, TAG_CHILD_PACKAGE); + serializer.attribute(null, ATTR_NAME, childPackageName); + serializer.endTag(null, TAG_CHILD_PACKAGE); + } + } + // Note: assumed "stopped" field is already cleared in all packages. // Legacy reader, used to read in the old file format after an upgrade. Not used after that. void readStoppedLPw() { @@ -2449,6 +2488,12 @@ final class Settings { serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId)); } + if (pkg.parentPackageName != null) { + serializer.attribute(null, "parentPackageName", pkg.parentPackageName); + } + + writeChildPackagesLPw(serializer, pkg.childPackageNames); + // If this is a shared user, the permissions will be written there. if (pkg.sharedUser == null) { writePermissionsLPr(serializer, pkg.getPermissionsState() @@ -2506,6 +2551,13 @@ final class Settings { if (pkg.volumeUuid != null) { serializer.attribute(null, "volumeUuid", pkg.volumeUuid); } + + if (pkg.parentPackageName != null) { + serializer.attribute(null, "parentPackageName", pkg.parentPackageName); + } + + writeChildPackagesLPw(serializer, pkg.childPackageNames); + pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); writePermissionsLPr(serializer, pkg.getPermissionsState() @@ -2798,7 +2850,8 @@ final class Settings { (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, pp.legacyNativeLibraryPathString, pp.primaryCpuAbiString, pp.secondaryCpuAbiString, pp.versionCode, pp.pkgFlags, pp.pkgPrivateFlags, - null, true /* add */, false /* allowInstall */); + null, true /* add */, false /* allowInstall */, pp.parentPackageName, + pp.childPackageNames); if (p == null) { PackageManagerService.reportSettingsProblem(Log.WARN, "Unable to create application package for " + pp.name); @@ -3246,6 +3299,8 @@ final class Settings { String legacyCpuAbiStr = parser.getAttributeValue(null, "requiredCpuAbi"); String legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); + String parentPackageName = parser.getAttributeValue(null, "parentPackageName"); + String primaryCpuAbiStr = parser.getAttributeValue(null, "primaryCpuAbi"); String secondaryCpuAbiStr = parser.getAttributeValue(null, "secondaryCpuAbi"); String cpuAbiOverrideStr = parser.getAttributeValue(null, "cpuAbiOverride"); @@ -3275,7 +3330,8 @@ final class Settings { } PackageSetting ps = new PackageSetting(name, realName, codePathFile, new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiStr, - secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags); + secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags, + parentPackageName, null); String timeStampStr = parser.getAttributeValue(null, "ft"); if (timeStampStr != null) { try { @@ -3324,6 +3380,12 @@ final class Settings { if (parser.getName().equals(TAG_PERMISSIONS)) { readInstallPermissionsLPr(parser, ps.getPermissionsState()); + } else if (parser.getName().equals(TAG_CHILD_PACKAGE)) { + String childPackageName = parser.getAttributeValue(null, ATTR_NAME); + if (ps.childPackageNames == null) { + ps.childPackageNames = new ArrayList<>(); + } + ps.childPackageNames.add(childPackageName); } else { PackageManagerService.reportSettingsProblem(Log.WARN, "Unknown element under <updated-package>: " + parser.getName()); @@ -3363,6 +3425,7 @@ final class Settings { PackageSettingBase packageSetting = null; String version = null; int versionCode = 0; + String parentPackageName; try { name = parser.getAttributeValue(null, ATTR_NAME); realName = parser.getAttributeValue(null, "realName"); @@ -3374,6 +3437,8 @@ final class Settings { legacyCpuAbiString = parser.getAttributeValue(null, "requiredCpuAbi"); + parentPackageName = parser.getAttributeValue(null, "parentPackageName"); + legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); primaryCpuAbiString = parser.getAttributeValue(null, "primaryCpuAbi"); secondaryCpuAbiString = parser.getAttributeValue(null, "secondaryCpuAbi"); @@ -3494,7 +3559,7 @@ final class Settings { packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags, - pkgPrivateFlags); + pkgPrivateFlags, parentPackageName, null); if (PackageManagerService.DEBUG_SETTINGS) Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" + userId + " pkg=" + packageSetting); @@ -3513,7 +3578,8 @@ final class Settings { packageSetting = new PendingPackage(name.intern(), realName, new File( codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - userId, versionCode, pkgFlags, pkgPrivateFlags); + userId, versionCode, pkgFlags, pkgPrivateFlags, parentPackageName, + null); packageSetting.setTimeStamp(timeStamp); packageSetting.firstInstallTime = firstInstallTime; packageSetting.lastUpdateTime = lastUpdateTime; @@ -3575,6 +3641,7 @@ final class Settings { packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE; } } + int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -3621,6 +3688,12 @@ final class Settings { packageSetting.keySetData.addDefinedKeySet(id, alias); } else if (tagName.equals(TAG_DOMAIN_VERIFICATION)) { readDomainVerificationLPw(parser, packageSetting); + } else if (tagName.equals(TAG_CHILD_PACKAGE)) { + String childPackageName = parser.getAttributeValue(null, ATTR_NAME); + if (packageSetting.childPackageNames == null) { + packageSetting.childPackageNames = new ArrayList<>(); + } + packageSetting.childPackageNames.add(childPackageName); } else { PackageManagerService.reportSettingsProblem(Log.WARN, "Unknown element under <package>: " + parser.getName()); @@ -3884,6 +3957,28 @@ final class Settings { return mVerifierDeviceIdentity; } + public boolean hasOtherDisabledSystemPkgWithChildLPr(String parentPackageName, + String childPackageName) { + final int packageCount = mDisabledSysPackages.size(); + for (int i = 0; i < packageCount; i++) { + PackageSetting disabledPs = mDisabledSysPackages.valueAt(i); + if (disabledPs.childPackageNames == null || disabledPs.childPackageNames.isEmpty()) { + continue; + } + if (disabledPs.name.equals(parentPackageName)) { + continue; + } + final int childCount = disabledPs.childPackageNames.size(); + for (int j = 0; j < childCount; j++) { + String currChildPackageName = disabledPs.childPackageNames.get(j); + if (currChildPackageName.equals(childPackageName)) { + return true; + } + } + } + return false; + } + public PackageSetting getDisabledSystemPkgLPr(String name) { PackageSetting ps = mDisabledSysPackages.get(name); return ps; @@ -4136,6 +4231,34 @@ final class Settings { } pw.println(); if (ps.pkg != null) { + if (ps.pkg.parentPackage != null) { + PackageParser.Package parentPkg = ps.pkg.parentPackage; + PackageSetting pps = mPackages.get(parentPkg.packageName); + if (pps == null || !pps.codePathString.equals(parentPkg.codePath)) { + pps = mDisabledSysPackages.get(parentPkg.packageName); + } + if (pps != null) { + pw.print(prefix); pw.print(" parentPackage="); + pw.println(pps.realName != null ? pps.realName : pps.name); + } + } else if (ps.pkg.childPackages != null) { + pw.print(prefix); pw.print(" childPackages=["); + final int childCount = ps.pkg.childPackages.size(); + for (int i = 0; i < childCount; i++) { + PackageParser.Package childPkg = ps.pkg.childPackages.get(i); + PackageSetting cps = mPackages.get(childPkg.packageName); + if (cps == null || !cps.codePathString.equals(childPkg.codePath)) { + cps = mDisabledSysPackages.get(childPkg.packageName); + } + if (cps != null) { + if (i > 0) { + pw.print(", "); + } + pw.print(cps.realName != null ? cps.realName : cps.name); + } + } + pw.println("]"); + } pw.print(prefix); pw.print(" versionName="); pw.println(ps.pkg.mVersionName); pw.print(prefix); pw.print(" splits="); dumpSplitNames(pw, ps.pkg); pw.println(); pw.print(prefix); pw.print(" applicationInfo="); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a92cc31659e6..c046ba610b3a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2645,11 +2645,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } else if (win.getAttrs().type == TYPE_DOCK_DIVIDER) { - if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { - return R.anim.fade_in; - } else if (transit == TRANSIT_EXIT) { - return R.anim.fade_out; - } + return selectDockedDividerAnimationLw(win, transit); } if (transit == TRANSIT_PREVIEW_DONE) { @@ -2669,6 +2665,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } + private int selectDockedDividerAnimationLw(WindowState win, int transit) { + int insets = mWindowManagerFuncs.getDockedDividerInsetsLw(); + + // If the divider is behind the navigation bar, don't animate. + if (mNavigationBar != null + && (win.getFrameLw().top + insets >= mNavigationBar.getFrameLw().top + || win.getFrameLw().left + insets >= mNavigationBar.getFrameLw().left)) { + return 0; + } + if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { + return R.anim.fade_in; + } else if (transit == TRANSIT_EXIT) { + return R.anim.fade_out; + } else { + return 0; + } + } + @Override public void selectRotationAnimationLw(int anim[]) { if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen=" diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 3e99a4cfe01e..0f51c82eba37 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -19,6 +19,7 @@ package com.android.server.tv; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED_STANDBY; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -1582,7 +1583,7 @@ public final class TvInputManagerService extends SystemService { } @Override - public void startRecording(IBinder sessionToken, int userId) { + public void startRecording(IBinder sessionToken, @Nullable Uri programHint, int userId) { final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, userId, "startRecording"); @@ -1590,7 +1591,8 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { - getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording(); + getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording( + programHint); } catch (RemoteException | SessionNotFoundException e) { Slog.e(TAG, "error in startRecording", e); } @@ -2474,7 +2476,8 @@ public final class TvInputManagerService extends SystemService { public void onSessionEvent(String eventType, Bundle eventArgs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onEvent(what=" + eventType + ", data=" + eventArgs + ")"); + Slog.d(TAG, "onEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2491,7 +2494,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStatusChanged(int status) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStatusChanged()"); + Slog.d(TAG, "onTimeShiftStatusChanged(status=" + status + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2508,7 +2511,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStartPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStartPositionChanged()"); + Slog.d(TAG, "onTimeShiftStartPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2525,7 +2528,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftCurrentPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftCurrentPositionChanged()"); + Slog.d(TAG, "onTimeShiftCurrentPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2580,7 +2583,8 @@ public final class TvInputManagerService extends SystemService { public void onRecordingStopped(Uri recordedProgramUri) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onRecordingStopped()"); + Slog.d(TAG, "onRecordingStopped(recordedProgramUri=" + recordedProgramUri + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2598,7 +2602,7 @@ public final class TvInputManagerService extends SystemService { public void onError(int error) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onError()"); + Slog.d(TAG, "onError(error=" + error + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 7ec945d74e52..93b1d6297a0c 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -127,6 +127,8 @@ class AppWindowToken extends WindowToken { boolean mAlwaysFocusable; + boolean mAppStopped; + ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>(); AppWindowToken(WindowManagerService _service, IApplicationToken _token, @@ -311,6 +313,47 @@ class AppWindowToken extends WindowToken { } } + // Here we destroy surfaces which have been marked as eligible by the animator, taking care + // to ensure the client has finished with them. If the client could still be using them + // we will skip destruction and try again when the client has stopped. + void destroySurfaces() { + final ArrayList<WindowState> allWindows = (ArrayList<WindowState>) allAppWindows.clone(); + final DisplayContentList displayList = new DisplayContentList(); + for (int i = allWindows.size() - 1; i >= 0; i--) { + final WindowState win = allWindows.get(i); + if (!win.mDestroying) { + continue; + } + + if (!mAppStopped && !win.mClientRemoveRequested) { + return; + } + + win.destroyOrSaveSurface(); + if (win.mRemoveOnExit) { + win.mExiting = false; + service.removeWindowInnerLocked(win); + } + final DisplayContent displayContent = win.getDisplayContent(); + if (displayContent != null && !displayList.contains(displayContent)) { + displayList.add(displayContent); + } + win.mDestroying = false; + } + for (int i = 0; i < displayList.size(); i++) { + final DisplayContent displayContent = displayList.get(i); + service.mLayersController.assignLayersLocked(displayContent.getWindowList()); + displayContent.layoutNeeded = true; + } + } + + // The application has stopped, so destroy any surfaces which were keeping alive + // in case they were still being used. + void notifyAppStopped() { + mAppStopped = true; + destroySurfaces(); + } + /** * Checks whether we should save surfaces for this app. * @@ -513,6 +556,9 @@ class AppWindowToken extends WindowToken { mFrozenBounds.remove(); for (int i = windows.size() - 1; i >= 0; i--) { final WindowState win = windows.get(i); + if (!win.mHasSurface) { + continue; + } win.mLayoutNeeded = true; win.setDisplayLayoutNeeded(); if (!service.mResizingWindows.contains(win)) { diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index 1bfdcceca3ec..0678ca2de365 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -22,7 +22,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Rect; import android.util.ArrayMap; @@ -41,8 +40,9 @@ import android.view.animation.LinearInterpolator; */ public class BoundsAnimationController { private static final String TAG = TAG_WITH_CLASS_NAME ? "BoundsAnimationController" : TAG_WM; + private static final int DEBUG_ANIMATION_SLOW_DOWN_FACTOR = 1; - // Only acccessed on UI thread. + // Only accessed on UI thread. private ArrayMap<AnimateBoundsUser, BoundsAnimator> mRunningAnimations = new ArrayMap<>(); private final class BoundsAnimator extends ValueAnimator @@ -52,14 +52,22 @@ public class BoundsAnimationController { private final Rect mTo; private final Rect mTmpRect; private final boolean mMoveToFullScreen; - - BoundsAnimator(AnimateBoundsUser target, Rect from, Rect to, boolean moveToFullScreen) { + // True if this this animation was cancelled and will be replaced the another animation from + // the same {@link #AnimateBoundsUser} target. + private boolean mWillReplace; + // True to true if this animation replaced a previous animation of the same + // {@link #AnimateBoundsUser} target. + private final boolean mReplacement; + + BoundsAnimator(AnimateBoundsUser target, Rect from, Rect to, + boolean moveToFullScreen, boolean replacement) { super(); mTarget = target; mFrom = from; mTo = to; mTmpRect = new Rect(); mMoveToFullScreen = moveToFullScreen; + mReplacement = replacement; addUpdateListener(this); addListener(this); } @@ -68,10 +76,10 @@ public class BoundsAnimationController { public void onAnimationUpdate(ValueAnimator animation) { final float value = (Float) animation.getAnimatedValue(); final float remains = 1 - value; - mTmpRect.left = (int) (mFrom.left * remains + mTo.left * value); - mTmpRect.top = (int) (mFrom.top * remains + mTo.top * value); - mTmpRect.right = (int) (mFrom.right * remains + mTo.right * value); - mTmpRect.bottom = (int) (mFrom.bottom * remains + mTo.bottom * value); + mTmpRect.left = (int) (mFrom.left * remains + mTo.left * value + 0.5f); + mTmpRect.top = (int) (mFrom.top * remains + mTo.top * value + 0.5f); + mTmpRect.right = (int) (mFrom.right * remains + mTo.right * value + 0.5f); + mTmpRect.bottom = (int) (mFrom.bottom * remains + mTo.bottom * value + 0.5f); if (DEBUG_ANIM) Slog.d(TAG, "animateUpdate: mTarget=" + mTarget + ", mBounds=" + mTmpRect + ", from=" + mFrom + ", mTo=" + mTo + ", value=" + value + ", remains=" + remains); @@ -85,13 +93,15 @@ public class BoundsAnimationController { @Override public void onAnimationStart(Animator animation) { - + if (!mReplacement) { + mTarget.onAnimationStart(); + } } @Override public void onAnimationEnd(Animator animation) { finishAnimation(); - if (mMoveToFullScreen) { + if (mMoveToFullScreen && !mWillReplace) { mTarget.moveToFullscreen(); } } @@ -101,8 +111,16 @@ public class BoundsAnimationController { finishAnimation(); } + @Override + public void cancel() { + mWillReplace = true; + super.cancel(); + } + private void finishAnimation() { - mTarget.finishBoundsAnimation(); + if (!mWillReplace) { + mTarget.onAnimationEnd(); + } removeListener(this); removeUpdateListener(this); mRunningAnimations.remove(mTarget); @@ -126,11 +144,13 @@ public class BoundsAnimationController { */ boolean setSize(Rect bounds); + void onAnimationStart(); + /** - * Callback for the target to inform it that the animation is finished, so it can do some + * Callback for the target to inform it that the animation has ended, so it can do some * necessary cleanup. */ - void finishBoundsAnimation(); + void onAnimationEnd(); void moveToFullscreen(); @@ -146,13 +166,15 @@ public class BoundsAnimationController { } final BoundsAnimator existing = mRunningAnimations.get(target); - if (existing != null) { + final boolean replacing = existing != null; + if (replacing) { existing.cancel(); } - BoundsAnimator animator = new BoundsAnimator(target, from, to, moveToFullscreen); + final BoundsAnimator animator = + new BoundsAnimator(target, from, to, moveToFullscreen, replacing); mRunningAnimations.put(target, animator); animator.setFloatValues(0f, 1f); - animator.setDuration(DEFAULT_APP_TRANSITION_DURATION); + animator.setDuration(DEFAULT_APP_TRANSITION_DURATION * DEBUG_ANIMATION_SLOW_DOWN_FACTOR); animator.setInterpolator(new LinearInterpolator()); animator.start(); } diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 72953183a173..412a45500157 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -72,6 +72,10 @@ public class DockedStackDividerController implements DimLayerUser { return mDividerWindowWidth - 2 * mDividerInsets; } + int getContentInsets() { + return mDividerInsets; + } + void setResizing(boolean resizing) { mResizing = resizing; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a06d3fc74393..4167ac48daa9 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -540,7 +540,7 @@ class Task implements DimLayer.DimLayerUser { } boolean isDragResizing() { - return mDragResizing; + return mDragResizing || (mStack != null && mStack.isDragResizing()); } void updateDisplayInfo(final DisplayContent displayContent) { @@ -584,7 +584,7 @@ class Task implements DimLayer.DimLayerUser { final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows; for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { final WindowState win = windows.get(winNdx); - if (!resizingWindows.contains(win)) { + if (win.mHasSurface && !resizingWindows.contains(win)) { if (DEBUG_RESIZE) Slog.d(TAG, "resizeWindows: Resizing " + win); resizingWindows.add(win); } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 40ca1c5a688c..a8b728923265 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -99,6 +99,9 @@ public class TaskStack implements DimLayer.DimLayerUser, boolean mDeferDetach; private boolean mUpdateBoundsAfterRotation = false; + // Whether the stack and all its tasks is currently being drag-resized + private boolean mDragResizing; + TaskStack(WindowManagerService service, int stackId) { mService = service; mStackId = stackId; @@ -911,6 +914,10 @@ public class TaskStack implements DimLayer.DimLayerUser, return false; } + boolean isDragResizing() { + return mDragResizing; + } + @Override // AnimatesBounds public boolean setSize(Rect bounds) { synchronized (mService.mWindowMap) { @@ -926,16 +933,17 @@ public class TaskStack implements DimLayer.DimLayerUser, } @Override // AnimatesBounds - public void finishBoundsAnimation() { + public void onAnimationStart() { synchronized (mService.mWindowMap) { - if (mTasks.isEmpty()) { - return; - } - final Task task = mTasks.get(mTasks.size() - 1); - if (task != null) { - task.setDragResizing(false); - mService.requestTraversal(); - } + mDragResizing = true; + } + } + + @Override // AnimatesBounds + public void onAnimationEnd() { + synchronized (mService.mWindowMap) { + mDragResizing = false; + mService.requestTraversal(); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ae6c89a4d610..d1ffaa07ed13 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2154,6 +2154,14 @@ public class WindowManagerService extends IWindowManager.Stub if (win == null) { return; } + // We set this here instead of removeWindowLocked because we only want it to be + // true when the client has requested we remove the window. In other remove + // cases, we have to wait for activity stop to safely remove the window (as the + // client may still be using the surface). In this case though, the client has + // just dismissed a window (for example a Dialog) and activity stop isn't + // necessarily imminent, so we need to know not to wait for it after our + // hanimation (if applicable) finishes. + win.mClientRemoveRequested = true; removeWindowLocked(win); } } @@ -4188,6 +4196,24 @@ public class WindowManagerService extends IWindowManager.Stub } @Override + public void notifyAppStopped(IBinder token) { + if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, + "notifyAppStopped()")) { + throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); + } + + synchronized(mWindowMap) { + final AppWindowToken wtoken; + wtoken = findAppWindowToken(token); + if (wtoken == null) { + Slog.w(TAG_WM, "Attempted to set visibility of non-existing app token: " + token); + return; + } + wtoken.notifyAppStopped(); + } + } + + @Override public void setAppVisibility(IBinder token, boolean visible) { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, "setAppVisibility()")) { @@ -4210,6 +4236,7 @@ public class WindowManagerService extends IWindowManager.Stub mOpeningApps.remove(wtoken); mClosingApps.remove(wtoken); + wtoken.mAppStopped = false; wtoken.waitingToShow = false; wtoken.hiddenRequested = !visible; @@ -9592,6 +9619,11 @@ public class WindowManagerService extends IWindowManager.Stub && !appWindow.mTask.inFreeformWorkspace(); } + @Override + public int getDockedDividerInsetsLw() { + return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets(); + } + void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) { pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); mPolicy.dump(" ", pw, args); @@ -10350,13 +10382,6 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG, "animateResizePinnedStack: stackId " + PINNED_STACK_ID + " not found."); return; } - final ArrayList<Task> tasks = stack.getTasks(); - if (tasks.isEmpty()) { - Slog.w(TAG, "animateResizePinnedStack: pinned stack doesn't have any tasks."); - return; - } - final Task task = tasks.get(tasks.size() - 1); - task.setDragResizing(true); final Rect originalBounds = new Rect(); stack.getBounds(originalBounds); UiThread.getHandler().post(new Runnable() { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 880514cd25f6..3430b3484ef7 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -386,6 +386,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mRemoved; /** + * Has the client requested we remove the window? In this case we know + * that we can dispose of it when we wish without further synchronization + * with the client + */ + boolean mClientRemoveRequested; + + /** * Temp for keeping track of windows that have been removed when * rebuilding window list. */ @@ -2145,7 +2152,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { // background. return (mDisplayContent.mDividerControllerLocked.isResizing() || mAppToken != null && !mAppToken.mFrozenBounds.isEmpty()) && - !task.inFreeformWorkspace(); + !task.inFreeformWorkspace() && isVisibleLw(); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index c7c9cbf3ce0e..02012961f5be 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -471,16 +471,31 @@ class WindowStateAnimator { if (WindowManagerService.localLOGV) Slog.v( TAG, "Exit animation finished in " + this + ": remove=" + mWin.mRemoveOnExit); - if (hasSurface()) { - mService.mDestroySurface.add(mWin); - mWin.mDestroying = true; - hide("finishExit"); - } - mWin.mExiting = false; - if (mWin.mRemoveOnExit) { - mService.mPendingRemove.add(mWin); - mWin.mRemoveOnExit = false; + + + mWin.mDestroying = true; + + // If we have an app token, we ask it to destroy the surface for us, + // so that it can take care to ensure the activity has actually stopped + // and the surface is not still in use. Otherwise we add the service to + // mDestroySurface and allow it to be processed in our next transaction. + if (mWin.mAppToken != null) { + if (hasSurface()) { + hide("finishExit"); + } + mWin.mAppToken.destroySurfaces(); + } else { + if (hasSurface()) { + mService.mDestroySurface.add(mWin); + hide("finishExit"); + } + mWin.mExiting = false; + if (mWin.mRemoveOnExit) { + mService.mPendingRemove.add(mWin); + mWin.mRemoveOnExit = false; + } } + mWallpaperControllerLocked.hideWallpapers(mWin); } diff --git a/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java index 7f9a0ded2a3d..ba83be19bed9 100644 --- a/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java @@ -39,7 +39,7 @@ public class KeySetManagerServiceTest extends AndroidTestCase { public PackageSetting generateFakePackageSetting(String name) { return new PackageSetting(name, name, new File(mContext.getCacheDir(), "fakeCodePath"), new File(mContext.getCacheDir(), "fakeResPath"), "", "", "", - "", 1, 0, 0); + "", 1, 0, 0, null, null); } @Override diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 2560c31196f0..8d1b124809a3 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -348,6 +348,11 @@ public class IWindowManagerImpl implements IWindowManager { } @Override + public void notifyAppStopped(IBinder token) throws RemoteException { + // TODO Auto-generated method stub + } + + @Override public void setEventDispatching(boolean arg0) throws RemoteException { // TODO Auto-generated method stub } diff --git a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java index 611ed15c76b5..9fc1706ceb03 100644 --- a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java +++ b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java @@ -36,15 +36,15 @@ public class PasspointManagementObjectDefinition implements Parcelable { mMoTree = moTree; } - public String getmBaseUri() { + public String getBaseUri() { return mBaseUri; } - public String getmUrn() { + public String getUrn() { return mUrn; } - public String getmMoTree() { + public String getMoTree() { return mMoTree; } diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 503e4a25e9fb..9137d9d90439 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -136,6 +136,9 @@ public class RttManager { public static final int REASON_INVALID_REQUEST = -4; /** Do not have required permission */ public static final int REASON_PERMISSION_DENIED = -5; + /** Ranging failed because responder role is enabled in STA mode.*/ + public static final int + REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description"; @@ -191,6 +194,8 @@ public class RttManager { public int preambleSupported; //RTT bandwidth supported public int bwSupported; + // Whether STA responder role is supported. + public boolean responderSupported; @Override public String toString() { @@ -244,6 +249,9 @@ public class RttManager { sb.append("is supported."); + sb.append(" STA responder role is ") + .append(responderSupported ? "supported" : "not supported."); + return sb.toString(); } /** Implement the Parcelable interface {@hide} */ @@ -261,7 +269,7 @@ public class RttManager { dest.writeInt(lcrSupported ? 1 : 0); dest.writeInt(preambleSupported); dest.writeInt(bwSupported); - + dest.writeInt(responderSupported ? 1 : 0); } /** Implement the Parcelable interface {@hide} */ @@ -275,6 +283,7 @@ public class RttManager { capabilities.lcrSupported = in.readInt() == 1 ? true : false; capabilities.preambleSupported = in.readInt(); capabilities.bwSupported = in.readInt(); + capabilities.responderSupported = (in.readInt() == 1); return capabilities; } /** Implement the Parcelable interface {@hide} */ @@ -898,6 +907,160 @@ public class RttManager { sAsyncChannel.sendMessage(CMD_OP_STOP_RANGING, 0, removeListener(listener)); } + /** + * Callbacks for responder operations. + * <p> + * A {@link ResponderCallback} is the handle to the calling client. {@link RttManager} will keep + * a reference to the callback for the entire period when responder is enabled. The same + * callback as used in enabling responder needs to be passed for disabling responder. + * The client can freely destroy or reuse the callback after {@link RttManager#disableResponder} + * is called. + */ + public abstract static class ResponderCallback { + /** Callback when responder is enabled. */ + public abstract void onResponderEnabled(ResponderConfig config); + /** Callback when enabling responder failed. */ + public abstract void onResponderEnableFailure(int reason); + // TODO: consider adding onResponderAborted once it's supported. + } + + /** + * Enable Wi-Fi RTT responder mode on the device. The enabling result will be delivered via + * {@code callback}. + * <p> + * Note calling this method with the same callback when the responder is already enabled won't + * change the responder state, a cached {@link ResponderConfig} from the last enabling will be + * returned through the callback. + * + * @param callback Callback for responder enabling/disabling result. + * @throws IllegalArgumentException If {@code callback} is null. + */ + public void enableResponder(ResponderCallback callback) { + if (callback == null) { + throw new IllegalArgumentException("callback cannot be null"); + } + validateChannel(); + int key = putListenerIfAbsent(callback); + sAsyncChannel.sendMessage(CMD_OP_ENABLE_RESPONDER, 0, key); + } + + /** + * Disable Wi-Fi RTT responder mode on the device. The {@code callback} needs to be the + * same one used in {@link #enableResponder(ResponderCallback)}. + * <p> + * Calling this method when responder isn't enabled won't have any effect. The callback can be + * reused for enabling responder after this method is called. + * + * @param callback The same callback used for enabling responder. + * @throws IllegalArgumentException If {@code callback} is null. + */ + public void disableResponder(ResponderCallback callback) { + if (callback == null) { + throw new IllegalArgumentException("callback cannot be null"); + } + validateChannel(); + int key = removeListener(callback); + if (key == INVALID_KEY) { + Log.e(TAG, "responder not enabled yet"); + return; + } + sAsyncChannel.sendMessage(CMD_OP_DISABLE_RESPONDER, 0, key); + } + + /** + * Configuration used for RTT responder mode. The configuration information can be used by a + * peer device to range the responder. + * + * @see ScanResult + */ + public static class ResponderConfig implements Parcelable { + + // TODO: make all fields final once we can get mac address from responder HAL APIs. + /** + * Wi-Fi mac address used for responder mode. + */ + public String macAddress = ""; + + /** + * The primary 20 MHz frequency (in MHz) of the channel where responder is enabled. + * @see ScanResult#frequency + */ + public int frequency; + + /** + * Center frequency of the channel where responder is enabled on. Only in use when channel + * width is at least 40MHz. + * @see ScanResult#centerFreq0 + */ + public int centerFreq0; + + /** + * Center frequency of the second segment when channel width is 80 + 80 MHz. + * @see ScanResult#centerFreq1 + */ + public int centerFreq1; + + /** + * Width of the channel where responder is enabled on. + * @see ScanResult#channelWidth + */ + public int channelWidth; + + /** + * Preamble supported by responder. + */ + public int preamble; + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("macAddress = ").append(macAddress) + .append(" frequency = ").append(frequency) + .append(" centerFreq0 = ").append(centerFreq0) + .append(" centerFreq1 = ").append(centerFreq1) + .append(" channelWidth = ").append(channelWidth) + .append(" preamble = ").append(preamble); + return builder.toString(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(macAddress); + dest.writeInt(frequency); + dest.writeInt(centerFreq0); + dest.writeInt(centerFreq1); + dest.writeInt(channelWidth); + dest.writeInt(preamble); + } + + /** Implement {@link Parcelable} interface */ + public static final Parcelable.Creator<ResponderConfig> CREATOR = + new Parcelable.Creator<ResponderConfig>() { + @Override + public ResponderConfig createFromParcel(Parcel in) { + ResponderConfig config = new ResponderConfig(); + config.macAddress = in.readString(); + config.frequency = in.readInt(); + config.centerFreq0 = in.readInt(); + config.centerFreq1 = in.readInt(); + config.channelWidth = in.readInt(); + config.preamble = in.readInt(); + return config; + } + + @Override + public ResponderConfig[] newArray(int size) { + return new ResponderConfig[size]; + } + }; + + } + /* private methods */ public static final int BASE = Protocol.BASE_WIFI_RTT_MANAGER; @@ -906,6 +1069,12 @@ public class RttManager { public static final int CMD_OP_FAILED = BASE + 2; public static final int CMD_OP_SUCCEEDED = BASE + 3; public static final int CMD_OP_ABORTED = BASE + 4; + public static final int CMD_OP_ENABLE_RESPONDER = BASE + 5; + public static final int CMD_OP_DISABLE_RESPONDER = BASE + 6; + public static final int + CMD_OP_ENALBE_RESPONDER_SUCCEEDED = BASE + 7; + public static final int + CMD_OP_ENALBE_RESPONDER_FAILED = BASE + 8; private Context mContext; private IRttManager mService; @@ -992,6 +1161,23 @@ public class RttManager { return key; } + // Insert a listener if it doesn't exist in sListenerMap. Returns the key of the listener. + private static int putListenerIfAbsent(Object listener) { + if (listener == null) return INVALID_KEY; + synchronized (sListenerMapLock) { + int key = getListenerKey(listener); + if (key != INVALID_KEY) { + return key; + } + do { + key = sListenerKey++; + } while (key == INVALID_KEY); + sListenerMap.put(key, listener); + return key; + } + + } + private static Object getListener(int key) { if (key == INVALID_KEY) return null; synchronized (sListenerMapLock) { @@ -1047,9 +1233,9 @@ public class RttManager { // to fail and throw an exception sAsyncChannel = null; } - sConnected.countDown(); return; case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: + sConnected.countDown(); return; case AsyncChannel.CMD_CHANNEL_DISCONNECTED: Log.e(TAG, "Channel connection lost"); @@ -1082,6 +1268,14 @@ public class RttManager { ((RttListener) listener).onAborted(); removeListener(msg.arg2); break; + case CMD_OP_ENALBE_RESPONDER_SUCCEEDED: + ResponderConfig config = (ResponderConfig) msg.obj; + ((ResponderCallback) (listener)).onResponderEnabled(config); + break; + case CMD_OP_ENALBE_RESPONDER_FAILED: + ((ResponderCallback) (listener)).onResponderEnableFailure(msg.arg1); + removeListener(msg.arg2); + break; default: if (DBG) Log.d(TAG, "Ignoring message " + msg.what); return; |