diff options
472 files changed, 5438 insertions, 4073 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index bd3227f82037..c35f332347ab 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -227,6 +227,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew  $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/widget/ILockSettingsObserver.java)  $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/SystemUI_intermediates/)  $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/Keyguard_intermediates/) +$(call add-clean-step, rm -f $(OUT_DIR)/target/product/*/system/framework/android.policy.jar)  # ******************************************************************  # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER diff --git a/api/current.txt b/api/current.txt index 1abcdb1fe0c2..cd4f73aecf18 100644 --- a/api/current.txt +++ b/api/current.txt @@ -12791,6 +12791,7 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE; @@ -12801,8 +12802,10 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<byte[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY;      field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES; @@ -12882,6 +12885,7 @@ package android.hardware.camera2 {      field public static final int CONTROL_AE_MODE_ON_ALWAYS_FLASH = 3; // 0x3      field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH = 2; // 0x2      field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE = 4; // 0x4 +    field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL = 2; // 0x2      field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_IDLE = 0; // 0x0      field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; // 0x1      field public static final int CONTROL_AE_STATE_CONVERGED = 2; // 0x2 @@ -13048,7 +13052,11 @@ package android.hardware.camera2 {      field public static final int SYNC_MAX_LATENCY_UNKNOWN = -1; // 0xffffffff      field public static final int TONEMAP_MODE_CONTRAST_CURVE = 0; // 0x0      field public static final int TONEMAP_MODE_FAST = 1; // 0x1 +    field public static final int TONEMAP_MODE_GAMMA_VALUE = 3; // 0x3      field public static final int TONEMAP_MODE_HIGH_QUALITY = 2; // 0x2 +    field public static final int TONEMAP_MODE_PRESET_CURVE = 4; // 0x4 +    field public static final int TONEMAP_PRESET_CURVE_REC709 = 1; // 0x1 +    field public static final int TONEMAP_PRESET_CURVE_SRGB = 0; // 0x0    }    public class CaptureFailure { @@ -13116,7 +13124,9 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;      field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; +    field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA;      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE; +    field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;    }    public static final class CaptureRequest.Builder { @@ -13204,7 +13214,9 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;      field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; +    field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA;      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE; +    field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;    }    public static final class CaptureResult.Key { diff --git a/api/system-current.txt b/api/system-current.txt index d971ce7a4b1a..ce68ca9c51e8 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6502,6 +6502,8 @@ package android.bluetooth {      method public java.lang.String getName();      method public int getType();      method public android.os.ParcelUuid[] getUuids(); +    method public boolean isConnected(); +    method public boolean isEncrypted();      method public boolean setPairingConfirmation(boolean);      method public boolean setPin(byte[]);      method public void writeToParcel(android.os.Parcel, int); @@ -8003,6 +8005,7 @@ package android.content {      field public static final java.lang.String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";      field public static final java.lang.String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";      field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED"; +    field public static final java.lang.String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";      field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK";      field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT";      field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN"; @@ -8101,6 +8104,7 @@ package android.content {      field public static final java.lang.String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";      field public static final java.lang.String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";      field public static final java.lang.String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI"; +    field public static final java.lang.String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";      field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";      field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";      field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME"; @@ -12815,6 +12819,7 @@ package android.hardware {      field public static final java.lang.String STRING_TYPE_STEP_COUNTER = "android.sensor.step_counter";      field public static final java.lang.String STRING_TYPE_STEP_DETECTOR = "android.sensor.step_detector";      field public static final deprecated java.lang.String STRING_TYPE_TEMPERATURE = "android.sensor.temperature"; +    field public static final java.lang.String STRING_TYPE_WRIST_TILT_GESTURE = "android.sensor.wrist_tilt_gesture";      field public static final int TYPE_ACCELEROMETER = 1; // 0x1      field public static final int TYPE_ALL = -1; // 0xffffffff      field public static final int TYPE_AMBIENT_TEMPERATURE = 13; // 0xd @@ -12837,6 +12842,7 @@ package android.hardware {      field public static final int TYPE_STEP_COUNTER = 19; // 0x13      field public static final int TYPE_STEP_DETECTOR = 18; // 0x12      field public static final deprecated int TYPE_TEMPERATURE = 7; // 0x7 +    field public static final int TYPE_WRIST_TILT_GESTURE = 26; // 0x1a    }    public class SensorEvent { @@ -13061,6 +13067,7 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE;      field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE; @@ -13071,8 +13078,10 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES; +    field public static final android.hardware.camera2.CameraCharacteristics.Key<byte[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT;      field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY;      field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES; @@ -13152,6 +13161,7 @@ package android.hardware.camera2 {      field public static final int CONTROL_AE_MODE_ON_ALWAYS_FLASH = 3; // 0x3      field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH = 2; // 0x2      field public static final int CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE = 4; // 0x4 +    field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL = 2; // 0x2      field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_IDLE = 0; // 0x0      field public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; // 0x1      field public static final int CONTROL_AE_STATE_CONVERGED = 2; // 0x2 @@ -13318,7 +13328,11 @@ package android.hardware.camera2 {      field public static final int SYNC_MAX_LATENCY_UNKNOWN = -1; // 0xffffffff      field public static final int TONEMAP_MODE_CONTRAST_CURVE = 0; // 0x0      field public static final int TONEMAP_MODE_FAST = 1; // 0x1 +    field public static final int TONEMAP_MODE_GAMMA_VALUE = 3; // 0x3      field public static final int TONEMAP_MODE_HIGH_QUALITY = 2; // 0x2 +    field public static final int TONEMAP_MODE_PRESET_CURVE = 4; // 0x4 +    field public static final int TONEMAP_PRESET_CURVE_REC709 = 1; // 0x1 +    field public static final int TONEMAP_PRESET_CURVE_SRGB = 0; // 0x0    }    public class CaptureFailure { @@ -13386,7 +13400,9 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;      field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; +    field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA;      field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE; +    field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;    }    public static final class CaptureRequest.Builder { @@ -13474,7 +13490,9 @@ package android.hardware.camera2 {      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;      field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; +    field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA;      field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE; +    field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;    }    public static final class CaptureResult.Key { diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 8b4b2920573d..e95fbfcfeb82 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -27,7 +27,6 @@ import android.widget.Toolbar;  import com.android.internal.app.IVoiceInteractor;  import com.android.internal.app.WindowDecorActionBar;  import com.android.internal.app.ToolbarActionBar; -import com.android.internal.policy.PolicyManager;  import android.annotation.IntDef;  import android.annotation.Nullable; @@ -84,6 +83,7 @@ import android.view.Menu;  import android.view.MenuInflater;  import android.view.MenuItem;  import android.view.MotionEvent; +import android.view.PhoneWindow;  import android.view.View;  import android.view.View.OnCreateContextMenuListener;  import android.view.ViewGroup; @@ -5929,7 +5929,7 @@ public class Activity extends ContextThemeWrapper          mFragments.attachActivity(this, mContainer, null); -        mWindow = PolicyManager.makeNewWindow(this); +        mWindow = new PhoneWindow(this);          mWindow.setCallback(this);          mWindow.setOnWindowDismissedCallback(this);          mWindow.getLayoutInflater().setPrivateFactory(this); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index de3c95c72bff..e08fc5bb4715 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -294,6 +294,8 @@ public final class ActivityThread {          Configuration newConfig;          Configuration createdConfig;          Configuration overrideConfig; +        // Used for consolidating configs before sending on to Activity. +        private Configuration tmpConfig = new Configuration();          ActivityClientRecord nextIdle;          ProfilerInfo profilerInfo; @@ -557,6 +559,15 @@ public final class ActivityThread {          int requestType;      } +    static final class ActivityConfigChangeData { +        final IBinder activityToken; +        final Configuration overrideConfig; +        public ActivityConfigChangeData(IBinder token, Configuration config) { +            activityToken = token; +            overrideConfig = config; +        } +    } +      private native void dumpGraphicsInfo(FileDescriptor fd);      private class ApplicationThread extends ApplicationThreadNative { @@ -888,15 +899,19 @@ public final class ActivityThread {                      sticky, sendingUser);          } +        @Override          public void scheduleLowMemory() {              sendMessage(H.LOW_MEMORY, null);          }          @Override -        public void scheduleActivityConfigurationChanged(IBinder token) { -            sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED, token); +        public void scheduleActivityConfigurationChanged( +                IBinder token, Configuration overrideConfig) { +            sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED, +                    new ActivityConfigChangeData(token, overrideConfig));          } +        @Override          public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {              sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType);          } @@ -1456,7 +1471,7 @@ public final class ActivityThread {                      break;                  case ACTIVITY_CONFIGURATION_CHANGED:                      Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged"); -                    handleActivityConfigurationChanged((IBinder)msg.obj); +                    handleActivityConfigurationChanged((ActivityConfigChangeData)msg.obj);                      Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                      break;                  case PROFILER_CONTROL: @@ -3099,10 +3114,14 @@ public final class ActivityThread {              if (!r.activity.mFinished && willBeVisible                      && r.activity.mDecor != null && !r.hideForNow) {                  if (r.newConfig != null) { +                    r.tmpConfig.setTo(r.newConfig); +                    if (r.overrideConfig != null) { +                        r.tmpConfig.updateFrom(r.overrideConfig); +                    }                      if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity " -                            + r.activityInfo.name + " with newConfig " + r.newConfig); -                    performConfigurationChanged(r.activity, r.newConfig); -                    freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.newConfig)); +                            + r.activityInfo.name + " with newConfig " + r.tmpConfig); +                    performConfigurationChanged(r.activity, r.tmpConfig); +                    freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig));                      r.newConfig = null;                  }                  if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward=" @@ -3431,10 +3450,14 @@ public final class ActivityThread {                      }                  }                  if (r.newConfig != null) { +                    r.tmpConfig.setTo(r.newConfig); +                    if (r.overrideConfig != null) { +                        r.tmpConfig.updateFrom(r.overrideConfig); +                    }                      if (DEBUG_CONFIGURATION) Slog.v(TAG, "Updating activity vis " -                            + r.activityInfo.name + " with new config " + r.newConfig); -                    performConfigurationChanged(r.activity, r.newConfig); -                    freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.newConfig)); +                            + r.activityInfo.name + " with new config " + r.tmpConfig); +                    performConfigurationChanged(r.activity, r.tmpConfig); +                    freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig));                      r.newConfig = null;                  }              } else { @@ -4164,16 +4187,21 @@ public final class ActivityThread {          }      } -    final void handleActivityConfigurationChanged(IBinder token) { -        ActivityClientRecord r = mActivities.get(token); +    final void handleActivityConfigurationChanged(ActivityConfigChangeData data) { +        ActivityClientRecord r = mActivities.get(data.activityToken);          if (r == null || r.activity == null) {              return;          }          if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: "                  + r.activityInfo.name); -         -        performConfigurationChanged(r.activity, mCompatConfiguration); + +        r.tmpConfig.setTo(mCompatConfiguration); +        if (data.overrideConfig != null) { +            r.overrideConfig = data.overrideConfig; +            r.tmpConfig.updateFrom(data.overrideConfig); +        } +        performConfigurationChanged(r.activity, r.tmpConfig);          freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(mCompatConfiguration)); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 967e97e5af66..d808c8b9d644 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -63,6 +63,7 @@ import android.os.UserManager;  import android.util.ArrayMap;  import android.util.Log;  import android.view.Display; +import android.os.SystemProperties;  import com.android.internal.annotations.GuardedBy;  import com.android.internal.util.Preconditions; @@ -287,7 +288,12 @@ final class ApplicationPackageManager extends PackageManager {          // depending on what the current runtime's instruction set is.          if (info.primaryCpuAbi != null && info.secondaryCpuAbi != null) {              final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet(); -            final String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi); + +            // Get the instruction set that the libraries of secondary Abi is supported. +            // In presence of a native bridge this might be different than the one secondary Abi used. +            String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi); +            final String secondaryDexCodeIsa = SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa); +            secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;              // If the runtimeIsa is the same as the primary isa, then we do nothing.              // Everything will be set up correctly because info.nativeLibraryDir will diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 349b66dd51c7..b6989abfc578 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -409,7 +409,11 @@ public abstract class ApplicationThreadNative extends Binder          {              data.enforceInterface(IApplicationThread.descriptor);              IBinder b = data.readStrongBinder(); -            scheduleActivityConfigurationChanged(b); +            Configuration overrideConfig = null; +            if (data.readInt() != 0) { +                overrideConfig = Configuration.CREATOR.createFromParcel(data); +            } +            scheduleActivityConfigurationChanged(b, overrideConfig);              return true;          } @@ -1116,6 +1120,7 @@ class ApplicationThreadProxy implements IApplicationThread {          data.recycle();      } +    @Override      public final void scheduleLowMemory() throws RemoteException {          Parcel data = Parcel.obtain();          data.writeInterfaceToken(IApplicationThread.descriptor); @@ -1124,15 +1129,24 @@ class ApplicationThreadProxy implements IApplicationThread {          data.recycle();      } -    public final void scheduleActivityConfigurationChanged(IBinder token) throws RemoteException { +    @Override +    public final void scheduleActivityConfigurationChanged( +            IBinder token, Configuration overrideConfig) throws RemoteException {          Parcel data = Parcel.obtain();          data.writeInterfaceToken(IApplicationThread.descriptor);          data.writeStrongBinder(token); +        if (overrideConfig != null) { +            data.writeInt(1); +            overrideConfig.writeToParcel(data, 0); +        } else { +            data.writeInt(0); +        }          mRemote.transact(SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION, data, null,                  IBinder.FLAG_ONEWAY);          data.recycle();      } +    @Override      public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)              throws RemoteException {          Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 39caf0b32d65..6c78cab9486e 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -24,7 +24,6 @@ import android.service.persistentdata.IPersistentDataBlockService;  import android.service.persistentdata.PersistentDataBlockManager;  import com.android.internal.appwidget.IAppWidgetService; -import com.android.internal.policy.PolicyManager;  import com.android.internal.util.Preconditions;  import android.bluetooth.BluetoothManager; @@ -139,6 +138,7 @@ import android.util.Slog;  import android.view.DisplayAdjustments;  import android.view.ContextThemeWrapper;  import android.view.Display; +import android.view.PhoneLayoutInflater;  import android.view.WindowManagerImpl;  import android.view.accessibility.AccessibilityManager;  import android.view.accessibility.CaptioningManager; @@ -235,7 +235,6 @@ class ContextImpl extends Context {      private final Resources mResources;      private final Display mDisplay; // may be null if default display      private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); -    private final Configuration mOverrideConfiguration;      private final boolean mRestricted; @@ -480,7 +479,7 @@ class ContextImpl extends Context {          registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {                  public Object createService(ContextImpl ctx) { -                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); +                    return new PhoneLayoutInflater(ctx.getOuterContext());                  }});          registerService(LOCATION_SERVICE, new ServiceFetcher() { @@ -2149,7 +2148,7 @@ class ContextImpl extends Context {              final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;              ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken,                      new UserHandle(UserHandle.getUserId(application.uid)), restricted, -                    mDisplay, mOverrideConfiguration); +                    mDisplay, null);              if (c.mResources != null) {                  return c;              } @@ -2172,14 +2171,14 @@ class ContextImpl extends Context {          final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;          if (packageName.equals("system") || packageName.equals("android")) {              return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, -                    user, restricted, mDisplay, mOverrideConfiguration); +                    user, restricted, mDisplay, null);          }          LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(),                  flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier());          if (pi != null) {              ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, -                    user, restricted, mDisplay, mOverrideConfiguration); +                    user, restricted, mDisplay, null);              if (c.mResources != null) {                  return c;              } @@ -2207,7 +2206,7 @@ class ContextImpl extends Context {          }          return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, -                mUser, mRestricted, display, mOverrideConfiguration); +                mUser, mRestricted, display, null);      }      private int getDisplayId() { @@ -2287,7 +2286,6 @@ class ContextImpl extends Context {          mPackageInfo = packageInfo;          mResourcesManager = ResourcesManager.getInstance();          mDisplay = display; -        mOverrideConfiguration = overrideConfiguration;          final int displayId = getDisplayId();          CompatibilityInfo compatInfo = null; diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 067073a1f71c..70e6e5a21086 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -16,14 +16,13 @@  package android.app; -import android.content.pm.ApplicationInfo;  import com.android.internal.app.WindowDecorActionBar; -import com.android.internal.policy.PolicyManager;  import android.content.ComponentName;  import android.content.Context;  import android.content.ContextWrapper;  import android.content.DialogInterface; +import android.content.pm.ApplicationInfo;  import android.graphics.drawable.Drawable;  import android.net.Uri;  import android.os.Bundle; @@ -42,6 +41,7 @@ import android.view.LayoutInflater;  import android.view.Menu;  import android.view.MenuItem;  import android.view.MotionEvent; +import android.view.PhoneWindow;  import android.view.View;  import android.view.View.OnCreateContextMenuListener;  import android.view.ViewGroup; @@ -134,14 +134,14 @@ public class Dialog implements DialogInterface, Window.Callback,      /**       * Create a Dialog window that uses a custom dialog style. -     *  +     *       * @param context The Context in which the Dialog should run. In particular, it       *                uses the window manager and theme from this context to       *                present its UI. -     * @param theme A style resource describing the theme to use for the  -     * window. See <a href="{@docRoot}guide/topics/resources/available-resources.html#stylesandthemes">Style  -     * and Theme Resources</a> for more information about defining and using  -     * styles.  This theme is applied on top of the current theme in  +     * @param theme A style resource describing the theme to use for the +     * window. See <a href="{@docRoot}guide/topics/resources/available-resources.html#stylesandthemes">Style +     * and Theme Resources</a> for more information about defining and using +     * styles.  This theme is applied on top of the current theme in       * <var>context</var>.  If 0, the default dialog theme will be used.       */      public Dialog(Context context, int theme) { @@ -162,7 +162,7 @@ public class Dialog implements DialogInterface, Window.Callback,          }          mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); -        Window w = PolicyManager.makeNewWindow(mContext); +        Window w = new PhoneWindow(mContext);          mWindow = w;          w.setCallback(this);          w.setOnWindowDismissedCallback(this); diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index f2c912e2c8c6..3fb82f603e28 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -114,7 +114,8 @@ public interface IApplicationThread extends IInterface {              int resultCode, String data, Bundle extras, boolean ordered,              boolean sticky, int sendingUser, int processState) throws RemoteException;      void scheduleLowMemory() throws RemoteException; -    void scheduleActivityConfigurationChanged(IBinder token) throws RemoteException; +    void scheduleActivityConfigurationChanged(IBinder token, Configuration overrideConfig) +            throws RemoteException;      void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)              throws RemoteException;      void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index b01f87ed4d57..83c6c2bcbe8a 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -45,6 +45,7 @@ import android.util.Slog;  import android.util.SparseArray;  import android.view.DisplayAdjustments;  import android.view.Display; +import android.os.SystemProperties;  import dalvik.system.VMRuntime;  import java.io.File; @@ -156,7 +157,12 @@ public final class LoadedApk {          // depending on what the current runtime's instruction set is.          if (info.primaryCpuAbi != null && info.secondaryCpuAbi != null) {              final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet(); -            final String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi); + +            // Get the instruction set that the libraries of secondary Abi is supported. +            // In presence of a native bridge this might be different than the one secondary Abi used. +            String secondaryIsa = VMRuntime.getInstructionSet(info.secondaryCpuAbi); +            final String secondaryDexCodeIsa = SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa); +            secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;              // If the runtimeIsa is the same as the primary isa, then we do nothing.              // Everything will be set up correctly because info.nativeLibraryDir will diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index af48909501d1..318a3147eba9 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1518,8 +1518,8 @@ public class DevicePolicyManager {      public static final int WIPE_RESET_PROTECTION_DATA = 0x0002;      /** -     * Ask the user data be wiped.  This will cause the device to reboot, -     * erasing all user data while next booting up. +     * Ask the user data be wiped.  Wiping the primary user will cause the +     * device to reboot, erasing all user data while next booting up.       *       * <p>The calling device admin must have requested       * {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} to be able to call diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index c262baed4f23..b8f4bf8f044a 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1429,14 +1429,16 @@ public final class BluetoothAdapter {                  if (VDBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService);                  synchronized (mManagerCallback) {                      mService = bluetoothService; -                    for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ -                        try { -                            if (cb != null) { -                                cb.onBluetoothServiceUp(bluetoothService); -                            } else { -                                Log.d(TAG, "onBluetoothServiceUp: cb is null!!!"); -                            } -                        } catch (Exception e)  { Log.e(TAG,"",e);} +                    synchronized (mProxyServiceStateCallbacks) { +                        for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ +                            try { +                                if (cb != null) { +                                    cb.onBluetoothServiceUp(bluetoothService); +                                } else { +                                    Log.d(TAG, "onBluetoothServiceUp: cb is null!!!"); +                                } +                            } catch (Exception e)  { Log.e(TAG,"",e);} +                        }                      }                  }              } @@ -1448,14 +1450,16 @@ public final class BluetoothAdapter {                      if (mLeScanClients != null) mLeScanClients.clear();                      if (sBluetoothLeAdvertiser != null) sBluetoothLeAdvertiser.cleanup();                      if (sBluetoothLeScanner != null) sBluetoothLeScanner.cleanup(); -                    for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ -                        try { -                            if (cb != null) { -                                cb.onBluetoothServiceDown(); -                            } else { -                                Log.d(TAG, "onBluetoothServiceDown: cb is null!!!"); -                            } -                        } catch (Exception e)  { Log.e(TAG,"",e);} +                    synchronized (mProxyServiceStateCallbacks) { +                        for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ +                            try { +                                if (cb != null) { +                                    cb.onBluetoothServiceDown(); +                                } else { +                                    Log.d(TAG, "onBluetoothServiceDown: cb is null!!!"); +                                } +                            } catch (Exception e)  { Log.e(TAG,"",e);} +                        }                      }                  }              } @@ -1596,10 +1600,10 @@ public final class BluetoothAdapter {              return mManagerService;      } -    private ArrayList<IBluetoothManagerCallback> mProxyServiceStateCallbacks = new ArrayList<IBluetoothManagerCallback>(); +    final private ArrayList<IBluetoothManagerCallback> mProxyServiceStateCallbacks = new ArrayList<IBluetoothManagerCallback>();      /*package*/ IBluetooth getBluetoothService(IBluetoothManagerCallback cb) { -        synchronized (mManagerCallback) { +        synchronized (mProxyServiceStateCallbacks) {              if (cb == null) {                  Log.w(TAG, "getBluetoothService() called with no BluetoothManagerCallback");              } else if (!mProxyServiceStateCallbacks.contains(cb)) { @@ -1610,7 +1614,7 @@ public final class BluetoothAdapter {      }      /*package*/ void removeServiceStateCallback(IBluetoothManagerCallback cb) { -        synchronized (mManagerCallback) { +        synchronized (mProxyServiceStateCallbacks) {              mProxyServiceStateCallbacks.remove(cb);          }      } diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 5e50b696b227..bb0d0a39f56a 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -18,6 +18,7 @@ package android.bluetooth;  import android.annotation.SdkConstant;  import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SystemApi;  import android.content.Context;  import android.os.Parcel;  import android.os.Parcelable; @@ -67,6 +68,14 @@ public final class BluetoothDevice implements Parcelable {      private static final boolean DBG = false;      /** +     * Connection state bitmask as returned by getConnectionState. +     */ +    private static final int CONNECTION_STATE_DISCONNECTED = 0; +    private static final int CONNECTION_STATE_CONNECTED = 1; +    private static final int CONNECTION_STATE_ENCRYPTED_BREDR = 2; +    private static final int CONNECTION_STATE_ENCRYPTED_LE = 4; + +    /**       * Sentinel error value for this class. Guaranteed to not equal any other       * integer constant in this class. Provided as a convenience for functions       * that require a sentinel error value, for example: @@ -940,13 +949,36 @@ public final class BluetoothDevice implements Parcelable {       * @return True if there is at least one open connection to this device.       * @hide       */ +    @SystemApi      public boolean isConnected() {          if (sService == null) {              // BT is not enabled, we cannot be connected.              return false;          }          try { -            return sService.isConnected(this); +            return sService.getConnectionState(this) != CONNECTION_STATE_DISCONNECTED; +        } catch (RemoteException e) { +            Log.e(TAG, "", e); +            return false; +        } +    } + +    /** +     * Returns whether there is an open connection to this device +     * that has been encrypted. +     * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. +     * +     * @return True if there is at least one encrypted connection to this device. +     * @hide +     */ +    @SystemApi +    public boolean isEncrypted() { +        if (sService == null) { +            // BT is not enabled, we cannot be connected. +            return false; +        } +        try { +            return sService.getConnectionState(this) > CONNECTION_STATE_CONNECTED;          } catch (RemoteException e) {              Log.e(TAG, "", e);              return false; diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index cd4535a57f92..dabb1ceaea8f 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -59,7 +59,7 @@ interface IBluetooth      boolean cancelBondProcess(in BluetoothDevice device);      boolean removeBond(in BluetoothDevice device);      int getBondState(in BluetoothDevice device); -    boolean isConnected(in BluetoothDevice device); +    int getConnectionState(in BluetoothDevice device);      String getRemoteName(in BluetoothDevice device);      int getRemoteType(in BluetoothDevice device); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 37a46be7e1e9..582802b1f729 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1760,6 +1760,7 @@ public class Intent implements Parcelable, Cloneable {       * <p class="note">This is a protected intent that can only be sent       * by the system.       */ +    @SystemApi      @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)      public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";      /** @@ -3252,6 +3253,7 @@ public class Intent implements Parcelable, Cloneable {      /**       * @hide String array of package names.       */ +    @SystemApi      public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";      /** diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 04777baf1394..be41a7cf200c 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3083,9 +3083,6 @@ public class PackageParser {              a.info.maxRecents = sa.getInt(                      R.styleable.AndroidManifestActivity_maxRecents,                      ActivityManager.getDefaultAppRecentsLimitStatic()); -            a.info.screenOrientation = sa.getInt( -                    R.styleable.AndroidManifestActivity_screenOrientation, -                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);              a.info.configChanges = sa.getInt(R.styleable.AndroidManifestActivity_configChanges, 0);              a.info.softInputMode = sa.getInt(                      R.styleable.AndroidManifestActivity_windowSoftInputMode, 0); @@ -3113,6 +3110,14 @@ public class PackageParser {              a.info.resizeable = sa.getBoolean(                      R.styleable.AndroidManifestActivity_resizeableActivity,                      owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.MNC); +            if (a.info.resizeable) { +                // Fixed screen orientation isn't supported with resizeable activities. +                a.info.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +            } else { +                a.info.screenOrientation = sa.getInt( +                        R.styleable.AndroidManifestActivity_screenOrientation, +                        ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); +            }          } else {              a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;              a.info.configChanges = 0; diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index 4a743a50261f..a38609771802 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -35,6 +35,8 @@ import android.util.SparseArray;  import android.util.Xml;  import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.ArrayUtils;  import com.android.internal.util.FastXmlSerializer;  import com.google.android.collect.Lists;  import com.google.android.collect.Maps; @@ -55,6 +57,8 @@ import java.util.Collections;  import java.util.List;  import java.util.Map; +import libcore.io.IoUtils; +  /**   * Cache of registered services. This cache is lazily built by interrogating   * {@link PackageManager} on a per-user basis. It's updated as packages are @@ -112,13 +116,19 @@ public abstract class RegisteredServicesCache<V> {      public RegisteredServicesCache(Context context, String interfaceName, String metaDataName,              String attributeName, XmlSerializerAndParser<V> serializerAndParser) { +        this(context, interfaceName, metaDataName, attributeName, serializerAndParser, +                Environment.getDataDirectory()); +    } + +    @VisibleForTesting +    protected RegisteredServicesCache(Context context, String interfaceName, String metaDataName, +            String attributeName, XmlSerializerAndParser<V> serializerAndParser, File dataDir) {          mContext = context;          mInterfaceName = interfaceName;          mMetaDataName = metaDataName;          mAttributesName = attributeName;          mSerializerAndParser = serializerAndParser; -        File dataDir = Environment.getDataDirectory();          File systemDir = new File(dataDir, "system");          File syncDir = new File(systemDir, "registered_services");          mPersistentServicesFile = new AtomicFile(new File(syncDir, interfaceName + ".xml")); @@ -155,9 +165,19 @@ public abstract class RegisteredServicesCache<V> {              // package is going away, but it's the middle of an upgrade: keep the current              // state and do nothing here.  This clause is intentionally empty.          } else { +            int[] uids = null;              // either we're adding/changing, or it's a removal without replacement, so -            // we need to recalculate the set of available services -            generateServicesMap(userId); +            // we need to update the set of available services +            if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action) +                    || Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { +                uids = intent.getIntArrayExtra(Intent.EXTRA_CHANGED_UID_LIST); +            } else { +                int uid = intent.getIntExtra(Intent.EXTRA_UID, -1); +                if (uid > 0) { +                    uids = new int[] { uid }; +                } +            } +            generateServicesMap(uids, userId);          }      } @@ -270,7 +290,7 @@ public abstract class RegisteredServicesCache<V> {              // Find user and lazily populate cache              final UserServices<V> user = findOrCreateUserLocked(userId);              if (user.services == null) { -                generateServicesMap(userId); +                generateServicesMap(null, userId);              }              return user.services.get(type);          } @@ -285,14 +305,15 @@ public abstract class RegisteredServicesCache<V> {              // Find user and lazily populate cache              final UserServices<V> user = findOrCreateUserLocked(userId);              if (user.services == null) { -                generateServicesMap(userId); +                generateServicesMap(null, userId);              }              return Collections.unmodifiableCollection(                      new ArrayList<ServiceInfo<V>>(user.services.values()));          }      } -    private boolean inSystemImage(int callerUid) { +    @VisibleForTesting +    protected boolean inSystemImage(int callerUid) {          String[] packages = mContext.getPackageManager().getPackagesForUid(callerUid);          for (String name : packages) {              try { @@ -308,19 +329,27 @@ public abstract class RegisteredServicesCache<V> {          return false;      } +    @VisibleForTesting +    protected List<ResolveInfo> queryIntentServices(int userId) { +        final PackageManager pm = mContext.getPackageManager(); +        return pm.queryIntentServicesAsUser( +                new Intent(mInterfaceName), PackageManager.GET_META_DATA, userId); +    } +      /**       * Populate {@link UserServices#services} by scanning installed packages for       * given {@link UserHandle}. +     * @param changedUids the array of uids that have been affected, as mentioned in the broadcast +     *                    or null to assume that everything is affected. +     * @param userId the user for whom to update the services map.       */ -    private void generateServicesMap(int userId) { +    private void generateServicesMap(int[] changedUids, int userId) {          if (DEBUG) { -            Slog.d(TAG, "generateServicesMap() for " + userId); +            Slog.d(TAG, "generateServicesMap() for " + userId + ", changed UIDs = " + changedUids);          } -        final PackageManager pm = mContext.getPackageManager();          final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<ServiceInfo<V>>(); -        final List<ResolveInfo> resolveInfos = pm.queryIntentServicesAsUser( -                new Intent(mInterfaceName), PackageManager.GET_META_DATA, userId); +        final List<ResolveInfo> resolveInfos = queryIntentServices(userId);          for (ResolveInfo resolveInfo : resolveInfos) {              try {                  ServiceInfo<V> info = parseServiceInfo(resolveInfo); @@ -329,9 +358,7 @@ public abstract class RegisteredServicesCache<V> {                      continue;                  }                  serviceInfos.add(info); -            } catch (XmlPullParserException e) { -                Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e); -            } catch (IOException e) { +            } catch (XmlPullParserException|IOException e) {                  Log.w(TAG, "Unable to load service info " + resolveInfo.toString(), e);              }          } @@ -341,8 +368,6 @@ public abstract class RegisteredServicesCache<V> {              final boolean firstScan = user.services == null;              if (firstScan) {                  user.services = Maps.newHashMap(); -            } else { -                user.services.clear();              }              StringBuilder changes = new StringBuilder(); @@ -399,7 +424,10 @@ public abstract class RegisteredServicesCache<V> {              ArrayList<V> toBeRemoved = Lists.newArrayList();              for (V v1 : user.persistentServices.keySet()) { -                if (!containsType(serviceInfos, v1)) { +                // Remove a persisted service that's not in the currently available services list. +                // And only if it is in the list of changedUids. +                if (!containsType(serviceInfos, v1) +                        && containsUid(changedUids, user.persistentServices.get(v1))) {                      toBeRemoved.add(v1);                  }              } @@ -409,9 +437,20 @@ public abstract class RegisteredServicesCache<V> {                  }                  changed = true;                  user.persistentServices.remove(v1); +                user.services.remove(v1);                  notifyListener(v1, userId, true /* removed */);              }              if (DEBUG) { +                Log.d(TAG, "user.services="); +                for (V v : user.services.keySet()) { +                    Log.d(TAG, "  " + v + " " + user.services.get(v)); +                } +                Log.d(TAG, "user.persistentServices="); +                for (V v : user.persistentServices.keySet()) { +                    Log.d(TAG, "  " + v + " " + user.persistentServices.get(v)); +                } +            } +            if (DEBUG) {                  if (changes.length() > 0) {                      Log.d(TAG, "generateServicesMap(" + mInterfaceName + "): " +                              serviceInfos.size() + " services:\n" + changes); @@ -426,6 +465,14 @@ public abstract class RegisteredServicesCache<V> {          }      } +    /** +     * Returns true if the list of changed uids is null (wildcard) or the specified uid +     * is contained in the list of changed uids. +     */ +    private boolean containsUid(int[] changedUids, int uid) { +        return changedUids == null || ArrayUtils.contains(changedUids, uid); +    } +      private boolean containsType(ArrayList<ServiceInfo<V>> serviceInfos, V type) {          for (int i = 0, N = serviceInfos.size(); i < N; i++) {              if (serviceInfos.get(i).type.equals(type)) { @@ -447,7 +494,8 @@ public abstract class RegisteredServicesCache<V> {          return false;      } -    private ServiceInfo<V> parseServiceInfo(ResolveInfo service) +    @VisibleForTesting +    protected ServiceInfo<V> parseServiceInfo(ResolveInfo service)              throws XmlPullParserException, IOException {          android.content.pm.ServiceInfo si = service.serviceInfo;          ComponentName componentName = new ComponentName(si.packageName, si.name); @@ -537,12 +585,7 @@ public abstract class RegisteredServicesCache<V> {          } catch (Exception e) {              Log.w(TAG, "Error reading persistent services, starting from scratch", e);          } finally { -            if (fis != null) { -                try { -                    fis.close(); -                } catch (java.io.IOException e1) { -                } -            } +            IoUtils.closeQuietly(fis);          }      } @@ -573,7 +616,7 @@ public abstract class RegisteredServicesCache<V> {              out.endTag(null, "services");              out.endDocument();              mPersistentServicesFile.finishWrite(fos); -        } catch (java.io.IOException e1) { +        } catch (IOException e1) {              Log.w(TAG, "Error writing accounts", e1);              if (fos != null) {                  mPersistentServicesFile.failWrite(fos); @@ -581,6 +624,11 @@ public abstract class RegisteredServicesCache<V> {          }      } +    @VisibleForTesting +    protected Map<V, Integer> getPersistentServices(int userId) { +        return findOrCreateUserLocked(userId).persistentServices; +    } +      public abstract V parseServiceAttributes(Resources res,              String packageName, AttributeSet attrs);  } diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java index cf6a779f1fed..fa5e9d2d2c2d 100644 --- a/core/java/android/hardware/Sensor.java +++ b/core/java/android/hardware/Sensor.java @@ -18,6 +18,7 @@  package android.hardware;  import android.os.Build; +import android.annotation.SystemApi;  /**   * Class representing a sensor. Use {@link SensorManager#getSensorList} to get @@ -511,6 +512,27 @@ public final class Sensor {       */      public static final String STRING_TYPE_PICK_UP_GESTURE = "android.sensor.pick_up_gesture"; +     /** +     * A constant describing a wrist tilt gesture sensor. +     * +     * A sensor of this type triggers when the device face is tilted towards the user. +     * The only allowed return value is 1.0. +     * This sensor remains active until disabled. +     * +     * @hide This sensor is expected to only be used by the system ui +     */ +    @SystemApi +    public static final int TYPE_WRIST_TILT_GESTURE = 26; + +    /** +     * A constant string describing a wrist tilt gesture sensor. +     * +     * @hide This sensor is expected to only be used by the system ui +     * @see #TYPE_WRIST_TILT_GESTURE +     */ +    @SystemApi +    public static final String STRING_TYPE_WRIST_TILT_GESTURE = "android.sensor.wrist_tilt_gesture"; +      /**       * A constant describing all sensor types.       */ @@ -591,6 +613,7 @@ public final class Sensor {              1, // SENSOR_TYPE_WAKE_GESTURE              1, // SENSOR_TYPE_GLANCE_GESTURE              1, // SENSOR_TYPE_PICK_UP_GESTURE +            1, // SENSOR_TYPE_WRIST_TILT_GESTURE      };      /** diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index e4e5a8cd8e73..34b895b5c554 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -451,7 +451,8 @@ public abstract class SensorManager {          // non_wake-up version.          if (type == Sensor.TYPE_PROXIMITY || type == Sensor.TYPE_SIGNIFICANT_MOTION ||                  type == Sensor.TYPE_TILT_DETECTOR || type == Sensor.TYPE_WAKE_GESTURE || -                type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE) { +                type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE || +                type == Sensor.TYPE_WRIST_TILT_GESTURE) {              wakeUpSensor = true;          } diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index bb45b9151d2e..60ff32cf350d 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -1943,6 +1943,23 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri              new Key<Integer>("android.sensor.info.timestampSource", int.class);      /** +     * <p>Whether the RAW images output from this camera device are subject to +     * lens shading correction.</p> +     * <p>If TRUE, all images produced by the camera device in the RAW image formats will +     * have lens shading correction already applied to it. If FALSE, the images will +     * not be adjusted for lens shading correction. +     * See {@link CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW android.request.maxNumOutputRaw} for a list of RAW image formats.</p> +     * <p>This key will be <code>null</code> for all devices do not report this information. +     * Devices with RAW capability will always report this information in this key.</p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW +     */ +    @PublicKey +    public static final Key<Boolean> SENSOR_INFO_LENS_SHADING_APPLIED = +            new Key<Boolean>("android.sensor.info.lensShadingApplied", boolean.class); + +    /**       * <p>The standard reference illuminant used as the scene light source when       * calculating the {@link CameraCharacteristics#SENSOR_COLOR_TRANSFORM1 android.sensor.colorTransform1},       * {@link CameraCharacteristics#SENSOR_CALIBRATION_TRANSFORM1 android.sensor.calibrationTransform1}, and @@ -2233,6 +2250,22 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri              new Key<int[]>("android.sensor.availableTestPatternModes", int[].class);      /** +     * <p>List of lens shading modes for {@link CaptureRequest#SHADING_MODE android.shading.mode} that are supported by this camera device.</p> +     * <p>This list contains lens shading modes that can be set for the camera device. +     * Camera devices that support the MANUAL_POST_PROCESSING capability will always +     * list OFF and FAST mode. This includes all FULL level devices. +     * LEGACY devices will always only support FAST mode.</p> +     * <p><b>Range of valid values:</b><br> +     * Any value listed in {@link CaptureRequest#SHADING_MODE android.shading.mode}</p> +     * <p>This key is available on all devices.</p> +     * +     * @see CaptureRequest#SHADING_MODE +     */ +    @PublicKey +    public static final Key<int[]> SHADING_AVAILABLE_MODES = +            new Key<int[]>("android.shading.availableModes", int[].class); + +    /**       * <p>List of face detection modes for {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE android.statistics.faceDetectMode} that are       * supported by this camera device.</p>       * <p>OFF is always supported.</p> @@ -2276,6 +2309,23 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri              new Key<boolean[]>("android.statistics.info.availableHotPixelMapModes", boolean[].class);      /** +     * <p>List of lens shading map output modes for {@link CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE android.statistics.lensShadingMapMode} that +     * are supported by this camera device.</p> +     * <p>If no lens shading map output is available for this camera device, this key will +     * contain only OFF.</p> +     * <p>ON is always supported on devices with the RAW capability. +     * LEGACY mode devices will always only support OFF.</p> +     * <p><b>Range of valid values:</b><br> +     * Any value listed in {@link CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE android.statistics.lensShadingMapMode}</p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE +     */ +    @PublicKey +    public static final Key<byte[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES = +            new Key<byte[]>("android.statistics.info.availableLensShadingMapModes", byte[].class); + +    /**       * <p>Maximum number of supported points in the       * tonemap curve that can be used for {@link CaptureRequest#TONEMAP_CURVE android.tonemap.curve}.</p>       * <p>If the actual number of points provided by the application (in {@link CaptureRequest#TONEMAP_CURVE android.tonemap.curve}*) is @@ -2299,8 +2349,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri      /**       * <p>List of tonemapping modes for {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} that are supported by this camera       * device.</p> -     * <p>Camera devices that support the MANUAL_POST_PROCESSING capability will always list -     * CONTRAST_CURVE and FAST. This includes all FULL level devices.</p> +     * <p>Camera devices that support the MANUAL_POST_PROCESSING capability will always contain +     * at least one of below mode combinations:</p> +     * <ul> +     * <li>CONTRAST_CURVE and FAST</li> +     * <li>GAMMA_VALUE, PRESET_CURVE, and FAST</li> +     * </ul> +     * <p>This includes all FULL level devices.</p>       * <p><b>Range of valid values:</b><br>       * Any value listed in {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode}</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index af7d3650df68..ffe30d41bac2 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -374,13 +374,19 @@ public abstract class CameraMetadata<TKey> {       * The camera device supports basic manual control of the image post-processing       * stages. This means the following controls are guaranteed to be supported:</p>       * <ul> -     * <li>Manual tonemap control<ul> +     * <li> +     * <p>Manual tonemap control</p> +     * <ul>       * <li>{@link CaptureRequest#TONEMAP_CURVE android.tonemap.curve}</li>       * <li>{@link CaptureRequest#TONEMAP_MODE android.tonemap.mode}</li>       * <li>{@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}</li> +     * <li>{@link CaptureRequest#TONEMAP_GAMMA android.tonemap.gamma}</li> +     * <li>{@link CaptureRequest#TONEMAP_PRESET_CURVE android.tonemap.presetCurve}</li>       * </ul>       * </li> -     * <li>Manual white balance control<ul> +     * <li> +     * <p>Manual white balance control</p> +     * <ul>       * <li>{@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform}</li>       * <li>{@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains}</li>       * </ul> @@ -410,8 +416,10 @@ public abstract class CameraMetadata<TKey> {       * @see CaptureRequest#SHADING_MODE       * @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE       * @see CaptureRequest#TONEMAP_CURVE +     * @see CaptureRequest#TONEMAP_GAMMA       * @see CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS       * @see CaptureRequest#TONEMAP_MODE +     * @see CaptureRequest#TONEMAP_PRESET_CURVE       * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES       */      public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING = 2; @@ -1029,6 +1037,14 @@ public abstract class CameraMetadata<TKey> {       */      public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; +    /** +     * <p>The camera device will cancel any currently active or completed +     * precapture metering sequence, the auto-exposure routine will return to its +     * initial state.</p> +     * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER +     */ +    public static final int CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL = 2; +      //      // Enumeration values for CaptureRequest#CONTROL_AF_MODE      // @@ -2096,6 +2112,47 @@ public abstract class CameraMetadata<TKey> {       */      public static final int TONEMAP_MODE_HIGH_QUALITY = 2; +    /** +     * <p>Use the gamma value specified in {@link CaptureRequest#TONEMAP_GAMMA android.tonemap.gamma} to peform +     * tonemapping.</p> +     * <p>All color enhancement and tonemapping must be disabled, except +     * for applying the tonemapping curve specified by {@link CaptureRequest#TONEMAP_GAMMA android.tonemap.gamma}.</p> +     * <p>Must not slow down frame rate relative to raw sensor output.</p> +     * +     * @see CaptureRequest#TONEMAP_GAMMA +     * @see CaptureRequest#TONEMAP_MODE +     */ +    public static final int TONEMAP_MODE_GAMMA_VALUE = 3; + +    /** +     * <p>Use the preset tonemapping curve specified in +     * {@link CaptureRequest#TONEMAP_PRESET_CURVE android.tonemap.presetCurve} to peform tonemapping.</p> +     * <p>All color enhancement and tonemapping must be disabled, except +     * for applying the tonemapping curve specified by +     * {@link CaptureRequest#TONEMAP_PRESET_CURVE android.tonemap.presetCurve}.</p> +     * <p>Must not slow down frame rate relative to raw sensor output.</p> +     * +     * @see CaptureRequest#TONEMAP_PRESET_CURVE +     * @see CaptureRequest#TONEMAP_MODE +     */ +    public static final int TONEMAP_MODE_PRESET_CURVE = 4; + +    // +    // Enumeration values for CaptureRequest#TONEMAP_PRESET_CURVE +    // + +    /** +     * <p>Tonemapping curve is defined by sRGB</p> +     * @see CaptureRequest#TONEMAP_PRESET_CURVE +     */ +    public static final int TONEMAP_PRESET_CURVE_SRGB = 0; + +    /** +     * <p>Tonemapping curve is defined by ITU-R BT.709</p> +     * @see CaptureRequest#TONEMAP_PRESET_CURVE +     */ +    public static final int TONEMAP_PRESET_CURVE_REC709 = 1; +      //      // Enumeration values for CaptureResult#CONTROL_AE_STATE      // @@ -2143,7 +2200,10 @@ public abstract class CameraMetadata<TKey> {       * <p>AE has been asked to do a precapture sequence       * and is currently executing it.</p>       * <p>Precapture can be triggered through setting -     * {@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} to START.</p> +     * {@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} to START. Currently +     * active and completed (if it causes camera device internal AE lock) precapture +     * metering sequence can be canceled through setting +     * {@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} to CANCEL.</p>       * <p>Once PRECAPTURE completes, AE will transition to CONVERGED       * or FLASH_REQUIRED as appropriate. This is a transient       * state, the camera device may skip reporting this state in diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index a40d47a85966..7569ea5c9059 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -730,7 +730,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * ({@link CaptureRequest#SENSOR_EXPOSURE_TIME android.sensor.exposureTime}) and sensitivity ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity})       * parameters. The flash may be fired if the {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}       * is ON_AUTO_FLASH/ON_AUTO_FLASH_REDEYE and the scene is too dark. If the -     * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_ALWAYS_FLASH, the scene may become overexposed.</p> +     * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_ALWAYS_FLASH, the scene may become overexposed. +     * Similarly, AE precapture trigger CANCEL has no effect when AE is already locked.</p> +     * <p>When an AE precapture sequence is triggered, AE unlock will not be able to unlock +     * the AE if AE is locked by the camera device internally during precapture metering +     * sequence In other words, submitting requests with AE unlock has no effect for an +     * ongoing precapture metering sequence. Otherwise, the precapture metering sequence +     * will never succeed in a sequence of preview requests where AE lock is always set +     * to <code>false</code>.</p>       * <p>Since the camera device has a pipeline of in-flight requests, the settings that       * get locked do not necessarily correspond to the settings that were present in the       * latest capture result received from the camera device, since additional captures @@ -875,6 +882,11 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * included at all in the request settings. When included and       * set to START, the camera device will trigger the auto-exposure (AE)       * precapture metering sequence.</p> +     * <p>When set to CANCEL, the camera device will cancel any active +     * precapture metering trigger, and return to its initial AE state. +     * If a precapture metering sequence is already completed, and the camera +     * device has implicitly locked the AE for subsequent still capture, the +     * CANCEL trigger will unlock the AE and return to its initial AE state.</p>       * <p>The precapture sequence should be triggered before starting a       * high-quality still capture for final metering decisions to       * be made, and for firing pre-capture flash pulses to estimate @@ -890,7 +902,11 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * submitted. To ensure that the AE routine restarts normal scan, the application should       * submit a request with <code>{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} == true</code>, followed by a request       * with <code>{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} == false</code>, if the application decides not to submit a -     * still capture request after the precapture sequence completes.</p> +     * still capture request after the precapture sequence completes. Alternatively, for +     * API level 23 or newer devices, the CANCEL can be used to unlock the camera device +     * internally locked AE if the application doesn't submit a still capture request after +     * the AE precapture trigger. Note that, the CANCEL was added in API level 23, and must not +     * be used in devices that have earlier API levels.</p>       * <p>The exact effect of auto-exposure (AE) precapture trigger       * depends on the current AE mode and state; see       * {@link CaptureResult#CONTROL_AE_STATE android.control.aeState} for AE precapture state transition @@ -903,6 +919,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * <ul>       *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE IDLE}</li>       *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li> +     *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li>       * </ul></p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Limited capability</b> - @@ -915,6 +932,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL       * @see #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE       * @see #CONTROL_AE_PRECAPTURE_TRIGGER_START +     * @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL       */      @PublicKey      public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = @@ -2100,6 +2118,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       *   <li>{@link #SHADING_MODE_FAST FAST}</li>       *   <li>{@link #SHADING_MODE_HIGH_QUALITY HIGH_QUALITY}</li>       * </ul></p> +     * <p><b>Available values for this device:</b><br> +     * {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Full capability</b> -       * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the @@ -2108,6 +2128,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * @see CaptureRequest#CONTROL_AE_MODE       * @see CaptureRequest#CONTROL_AWB_MODE       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL +     * @see CameraCharacteristics#SHADING_AVAILABLE_MODES       * @see CaptureResult#STATISTICS_LENS_SHADING_CORRECTION_MAP       * @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE       * @see #SHADING_MODE_OFF @@ -2170,12 +2191,15 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       *   <li>{@link #STATISTICS_LENS_SHADING_MAP_MODE_OFF OFF}</li>       *   <li>{@link #STATISTICS_LENS_SHADING_MAP_MODE_ON ON}</li>       * </ul></p> +     * <p><b>Available values for this device:</b><br> +     * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Full capability</b> -       * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the       * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>       *       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL +     * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES       * @see #STATISTICS_LENS_SHADING_MAP_MODE_OFF       * @see #STATISTICS_LENS_SHADING_MAP_MODE_ON       */ @@ -2362,6 +2386,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       *   <li>{@link #TONEMAP_MODE_CONTRAST_CURVE CONTRAST_CURVE}</li>       *   <li>{@link #TONEMAP_MODE_FAST FAST}</li>       *   <li>{@link #TONEMAP_MODE_HIGH_QUALITY HIGH_QUALITY}</li> +     *   <li>{@link #TONEMAP_MODE_GAMMA_VALUE GAMMA_VALUE}</li> +     *   <li>{@link #TONEMAP_MODE_PRESET_CURVE PRESET_CURVE}</li>       * </ul></p>       * <p><b>Available values for this device:</b><br>       * {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p> @@ -2377,12 +2403,60 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>       * @see #TONEMAP_MODE_CONTRAST_CURVE       * @see #TONEMAP_MODE_FAST       * @see #TONEMAP_MODE_HIGH_QUALITY +     * @see #TONEMAP_MODE_GAMMA_VALUE +     * @see #TONEMAP_MODE_PRESET_CURVE       */      @PublicKey      public static final Key<Integer> TONEMAP_MODE =              new Key<Integer>("android.tonemap.mode", int.class);      /** +     * <p>Tonemapping curve to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is +     * GAMMA_VALUE</p> +     * <p>The tonemap curve will be defined the following formula: +     * * OUT = pow(IN, 1.0 / gamma) +     * where IN and OUT is the input pixel value scaled to range [0.0, 1.0], +     * pow is the power function and gamma is the gamma value specified by this +     * key.</p> +     * <p>The same curve will be applied to all color channels. The camera device +     * may clip the input gamma value to its supported range. The actual applied +     * value will be returned in capture result.</p> +     * <p>The valid range of gamma value varies on different devices, but values +     * within [1.0, 5.0] are guaranteed not to be clipped.</p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CaptureRequest#TONEMAP_MODE +     */ +    @PublicKey +    public static final Key<Float> TONEMAP_GAMMA = +            new Key<Float>("android.tonemap.gamma", float.class); + +    /** +     * <p>Tonemapping curve to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is +     * PRESET_CURVE</p> +     * <p>The tonemap curve will be defined by specified standard.</p> +     * <p>sRGB (approximated by 16 control points):</p> +     * <p><img alt="sRGB tonemapping curve" src="../../../../images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p> +     * <p>Rec. 709 (approximated by 16 control points):</p> +     * <p><img alt="Rec. 709 tonemapping curve" src="../../../../images/camera2/metadata/android.tonemap.curveRed/rec709_tonemap.png" /></p> +     * <p>Note that above figures show a 16 control points approximation of preset +     * curves. Camera devices may apply a different approximation to the curve.</p> +     * <p><b>Possible values:</b> +     * <ul> +     *   <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li> +     *   <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li> +     * </ul></p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CaptureRequest#TONEMAP_MODE +     * @see #TONEMAP_PRESET_CURVE_SRGB +     * @see #TONEMAP_PRESET_CURVE_REC709 +     */ +    @PublicKey +    public static final Key<Integer> TONEMAP_PRESET_CURVE = +            new Key<Integer>("android.tonemap.presetCurve", int.class); + +    /**       * <p>This LED is nominally used to indicate to the user       * that the camera is powered on and may be streaming images back to the       * Application Processor. In certain rare circumstances, the OS may diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 810d0f6fe7ba..b84dc2e0f8b8 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -581,7 +581,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * ({@link CaptureRequest#SENSOR_EXPOSURE_TIME android.sensor.exposureTime}) and sensitivity ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity})       * parameters. The flash may be fired if the {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}       * is ON_AUTO_FLASH/ON_AUTO_FLASH_REDEYE and the scene is too dark. If the -     * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_ALWAYS_FLASH, the scene may become overexposed.</p> +     * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_ALWAYS_FLASH, the scene may become overexposed. +     * Similarly, AE precapture trigger CANCEL has no effect when AE is already locked.</p> +     * <p>When an AE precapture sequence is triggered, AE unlock will not be able to unlock +     * the AE if AE is locked by the camera device internally during precapture metering +     * sequence In other words, submitting requests with AE unlock has no effect for an +     * ongoing precapture metering sequence. Otherwise, the precapture metering sequence +     * will never succeed in a sequence of preview requests where AE lock is always set +     * to <code>false</code>.</p>       * <p>Since the camera device has a pipeline of in-flight requests, the settings that       * get locked do not necessarily correspond to the settings that were present in the       * latest capture result received from the camera device, since additional captures @@ -726,6 +733,11 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * included at all in the request settings. When included and       * set to START, the camera device will trigger the auto-exposure (AE)       * precapture metering sequence.</p> +     * <p>When set to CANCEL, the camera device will cancel any active +     * precapture metering trigger, and return to its initial AE state. +     * If a precapture metering sequence is already completed, and the camera +     * device has implicitly locked the AE for subsequent still capture, the +     * CANCEL trigger will unlock the AE and return to its initial AE state.</p>       * <p>The precapture sequence should be triggered before starting a       * high-quality still capture for final metering decisions to       * be made, and for firing pre-capture flash pulses to estimate @@ -741,7 +753,11 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * submitted. To ensure that the AE routine restarts normal scan, the application should       * submit a request with <code>{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} == true</code>, followed by a request       * with <code>{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} == false</code>, if the application decides not to submit a -     * still capture request after the precapture sequence completes.</p> +     * still capture request after the precapture sequence completes. Alternatively, for +     * API level 23 or newer devices, the CANCEL can be used to unlock the camera device +     * internally locked AE if the application doesn't submit a still capture request after +     * the AE precapture trigger. Note that, the CANCEL was added in API level 23, and must not +     * be used in devices that have earlier API levels.</p>       * <p>The exact effect of auto-exposure (AE) precapture trigger       * depends on the current AE mode and state; see       * {@link CaptureResult#CONTROL_AE_STATE android.control.aeState} for AE precapture state transition @@ -754,6 +770,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * <ul>       *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE IDLE}</li>       *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li> +     *   <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li>       * </ul></p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Limited capability</b> - @@ -766,6 +783,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL       * @see #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE       * @see #CONTROL_AE_PRECAPTURE_TRIGGER_START +     * @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL       */      @PublicKey      public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = @@ -898,11 +916,29 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * <td align="center">Ready for high-quality capture</td>       * </tr>       * <tr> -     * <td align="center">Any state</td> +     * <td align="center">LOCKED</td> +     * <td align="center">aeLock is ON and aePrecaptureTrigger is START</td> +     * <td align="center">LOCKED</td> +     * <td align="center">Precapture trigger is ignored when AE is already locked</td> +     * </tr> +     * <tr> +     * <td align="center">LOCKED</td> +     * <td align="center">aeLock is ON and aePrecaptureTrigger is CANCEL</td> +     * <td align="center">LOCKED</td> +     * <td align="center">Precapture trigger is ignored when AE is already locked</td> +     * </tr> +     * <tr> +     * <td align="center">Any state (excluding LOCKED)</td>       * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START</td>       * <td align="center">PRECAPTURE</td>       * <td align="center">Start AE precapture metering sequence</td>       * </tr> +     * <tr> +     * <td align="center">Any state (excluding LOCKED)</td> +     * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL</td> +     * <td align="center">INACTIVE</td> +     * <td align="center">Currently active precapture metering sequence is canceled</td> +     * </tr>       * </tbody>       * </table>       * <p>For the above table, the camera device may skip reporting any state changes that happen @@ -928,18 +964,30 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * <td align="center">Values are already good, transient states are skipped by camera device.</td>       * </tr>       * <tr> -     * <td align="center">Any state</td> +     * <td align="center">Any state (excluding LOCKED)</td>       * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td>       * <td align="center">FLASH_REQUIRED</td>       * <td align="center">Converged but too dark w/o flash after a precapture sequence, transient states are skipped by camera device.</td>       * </tr>       * <tr> -     * <td align="center">Any state</td> +     * <td align="center">Any state (excluding LOCKED)</td>       * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td>       * <td align="center">CONVERGED</td>       * <td align="center">Converged after a precapture sequence, transient states are skipped by camera device.</td>       * </tr>       * <tr> +     * <td align="center">Any state (excluding LOCKED)</td> +     * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> +     * <td align="center">FLASH_REQUIRED</td> +     * <td align="center">Converged but too dark w/o flash after a precapture sequence is canceled, transient states are skipped by camera device.</td> +     * </tr> +     * <tr> +     * <td align="center">Any state (excluding LOCKED)</td> +     * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> +     * <td align="center">CONVERGED</td> +     * <td align="center">Converged after a precapture sequenceis canceled, transient states are skipped by camera device.</td> +     * </tr> +     * <tr>       * <td align="center">CONVERGED</td>       * <td align="center">Camera device finished AE scan</td>       * <td align="center">FLASH_REQUIRED</td> @@ -3006,6 +3054,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       *   <li>{@link #SHADING_MODE_FAST FAST}</li>       *   <li>{@link #SHADING_MODE_HIGH_QUALITY HIGH_QUALITY}</li>       * </ul></p> +     * <p><b>Available values for this device:</b><br> +     * {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Full capability</b> -       * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the @@ -3014,6 +3064,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * @see CaptureRequest#CONTROL_AE_MODE       * @see CaptureRequest#CONTROL_AWB_MODE       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL +     * @see CameraCharacteristics#SHADING_AVAILABLE_MODES       * @see CaptureResult#STATISTICS_LENS_SHADING_CORRECTION_MAP       * @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE       * @see #SHADING_MODE_OFF @@ -3177,7 +3228,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {      /**       * <p>The shading map is a low-resolution floating-point map       * that lists the coefficients used to correct for vignetting, for each -     * Bayer color channel.</p> +     * Bayer color channel of RAW image data.</p>       * <p>The least shaded section of the image should have a gain factor       * of 1; all other sections should have gains above 1.</p>       * <p>When {@link CaptureRequest#COLOR_CORRECTION_MODE android.colorCorrection.mode} = TRANSFORM_MATRIX, the map @@ -3213,8 +3264,20 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * <img alt="Green (odd rows) lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/green_o_shading.png" />       * <img alt="Blue lens shading map" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/blue_shading.png" /></p>       * <p>As a visualization only, inverting the full-color map to recover an -     * image of a gray wall (using bicubic interpolation for visual quality) as captured by the sensor gives:</p> +     * image of a gray wall (using bicubic interpolation for visual quality) +     * as captured by the sensor gives:</p>       * <p><img alt="Image of a uniform white wall (inverse shading map)" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/inv_shading.png" /></p> +     * <p>Note that the RAW image data might be subject to lens shading +     * correction not reported on this map. Query +     * {@link CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED android.sensor.info.lensShadingApplied} to see if RAW image data has subject +     * to lens shading correction. If {@link CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED android.sensor.info.lensShadingApplied} +     * is TRUE, the RAW image data is subject to partial or full lens shading +     * correction. In the case full lens shading correction is applied to RAW +     * images, the gain factor map reported in this key will contain all 1.0 gains. +     * In other words, the map reported in this key is the remaining lens shading +     * that needs to be applied on the RAW image to get images without lens shading +     * artifacts. See {@link CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW android.request.maxNumOutputRaw} for a list of RAW image +     * formats.</p>       * <p><b>Range of valid values:</b><br>       * Each gain factor is >= 1</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> @@ -3224,6 +3287,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       *       * @see CaptureRequest#COLOR_CORRECTION_MODE       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL +     * @see CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW +     * @see CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED       * @hide       */      public static final Key<float[]> STATISTICS_LENS_SHADING_MAP = @@ -3361,12 +3426,15 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       *   <li>{@link #STATISTICS_LENS_SHADING_MAP_MODE_OFF OFF}</li>       *   <li>{@link #STATISTICS_LENS_SHADING_MAP_MODE_ON ON}</li>       * </ul></p> +     * <p><b>Available values for this device:</b><br> +     * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p>       * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>       * <p><b>Full capability</b> -       * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the       * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>       *       * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL +     * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES       * @see #STATISTICS_LENS_SHADING_MAP_MODE_OFF       * @see #STATISTICS_LENS_SHADING_MAP_MODE_ON       */ @@ -3553,6 +3621,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       *   <li>{@link #TONEMAP_MODE_CONTRAST_CURVE CONTRAST_CURVE}</li>       *   <li>{@link #TONEMAP_MODE_FAST FAST}</li>       *   <li>{@link #TONEMAP_MODE_HIGH_QUALITY HIGH_QUALITY}</li> +     *   <li>{@link #TONEMAP_MODE_GAMMA_VALUE GAMMA_VALUE}</li> +     *   <li>{@link #TONEMAP_MODE_PRESET_CURVE PRESET_CURVE}</li>       * </ul></p>       * <p><b>Available values for this device:</b><br>       * {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p> @@ -3568,12 +3638,60 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {       * @see #TONEMAP_MODE_CONTRAST_CURVE       * @see #TONEMAP_MODE_FAST       * @see #TONEMAP_MODE_HIGH_QUALITY +     * @see #TONEMAP_MODE_GAMMA_VALUE +     * @see #TONEMAP_MODE_PRESET_CURVE       */      @PublicKey      public static final Key<Integer> TONEMAP_MODE =              new Key<Integer>("android.tonemap.mode", int.class);      /** +     * <p>Tonemapping curve to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is +     * GAMMA_VALUE</p> +     * <p>The tonemap curve will be defined the following formula: +     * * OUT = pow(IN, 1.0 / gamma) +     * where IN and OUT is the input pixel value scaled to range [0.0, 1.0], +     * pow is the power function and gamma is the gamma value specified by this +     * key.</p> +     * <p>The same curve will be applied to all color channels. The camera device +     * may clip the input gamma value to its supported range. The actual applied +     * value will be returned in capture result.</p> +     * <p>The valid range of gamma value varies on different devices, but values +     * within [1.0, 5.0] are guaranteed not to be clipped.</p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CaptureRequest#TONEMAP_MODE +     */ +    @PublicKey +    public static final Key<Float> TONEMAP_GAMMA = +            new Key<Float>("android.tonemap.gamma", float.class); + +    /** +     * <p>Tonemapping curve to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is +     * PRESET_CURVE</p> +     * <p>The tonemap curve will be defined by specified standard.</p> +     * <p>sRGB (approximated by 16 control points):</p> +     * <p><img alt="sRGB tonemapping curve" src="../../../../images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p> +     * <p>Rec. 709 (approximated by 16 control points):</p> +     * <p><img alt="Rec. 709 tonemapping curve" src="../../../../images/camera2/metadata/android.tonemap.curveRed/rec709_tonemap.png" /></p> +     * <p>Note that above figures show a 16 control points approximation of preset +     * curves. Camera devices may apply a different approximation to the curve.</p> +     * <p><b>Possible values:</b> +     * <ul> +     *   <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li> +     *   <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li> +     * </ul></p> +     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> +     * +     * @see CaptureRequest#TONEMAP_MODE +     * @see #TONEMAP_PRESET_CURVE_SRGB +     * @see #TONEMAP_PRESET_CURVE_REC709 +     */ +    @PublicKey +    public static final Key<Integer> TONEMAP_PRESET_CURVE = +            new Key<Integer>("android.tonemap.presetCurve", int.class); + +    /**       * <p>This LED is nominally used to indicate to the user       * that the camera is powered on and may be streaming images back to the       * Application Processor. In certain rare circumstances, the OS may diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index f1f2f0c466c4..cf3510db893a 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -85,7 +85,7 @@ public class RequestThreadManager {      private static final int PREVIEW_FRAME_TIMEOUT = 1000; // ms      private static final int JPEG_FRAME_TIMEOUT = 4000; // ms (same as CTS for API2) -    private static final int REQUEST_COMPLETE_TIMEOUT = JPEG_FRAME_TIMEOUT; // ms (same as JPEG timeout) +    private static final int REQUEST_COMPLETE_TIMEOUT = JPEG_FRAME_TIMEOUT;      private static final float ASPECT_RATIO_TOLERANCE = 0.01f;      private boolean mPreviewRunning = false; diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index e4b594a233bd..eb86e7ec1c17 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -650,15 +650,22 @@ public class Build {      }      /** -     * Check that device fingerprint is defined and that it matches across -     * various partitions. +     * Verifies the the current flash of the device is consistent with what +     * was expected at build time. +     * 1) Checks that device fingerprint is defined and that it matches across +     *    various partitions. +     * 2) Verifies radio and bootloader partitions are those expected in the build.       *       * @hide       */ -    public static boolean isFingerprintConsistent() { +    public static boolean isBuildConsistent() {          final String system = SystemProperties.get("ro.build.fingerprint");          final String vendor = SystemProperties.get("ro.vendor.build.fingerprint");          final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint"); +        final String requiredBootloader = SystemProperties.get("ro.build.expect.bootloader"); +        final String currentBootloader = SystemProperties.get("ro.bootloader"); +        final String requiredRadio = SystemProperties.get("ro.build.expect.baseband"); +        final String currentRadio = SystemProperties.get("gsm.version.baseband");          if (TextUtils.isEmpty(system)) {              Slog.e(TAG, "Required ro.build.fingerprint is empty!"); @@ -681,6 +688,22 @@ public class Build {              }          } +        if (!TextUtils.isEmpty(requiredBootloader)) { +            if (!Objects.equals(currentBootloader, requiredBootloader)) { +                Slog.e(TAG, "Mismatched bootloader version: build requires " + requiredBootloader +                        + " but runtime reports " + currentBootloader); +                return false; +            } +        } + +        if (!TextUtils.isEmpty(requiredRadio)) { +            if (!Objects.equals(currentRadio, requiredRadio)) { +                Slog.e(TAG, "Mismatched radio version: build requires " + requiredRadio +                        + " but runtime reports " + currentRadio); +                return false; +            } +        } +          return true;      } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index dddbe7890546..250e80fc30af 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2473,7 +2473,7 @@ public final class Settings {          /**           * Log raw orientation data from -         * {@link com.android.internal.policy.impl.WindowOrientationListener} for use with the +         * {@link com.android.server.policy.WindowOrientationListener} for use with the           * orientationplot.py tool.           * 0 = no           * 1 = yes @@ -6545,7 +6545,7 @@ public final class Settings {          /**           * Defines global runtime overrides to window policy.           * -         * See {@link com.android.internal.policy.impl.PolicyControl} for value format. +         * See {@link com.android.server.policy.PolicyControl} for value format.           *           * @hide           */ diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 38b043971572..3c57ddaa01aa 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -37,6 +37,7 @@ import android.view.KeyEvent;  import android.view.Menu;  import android.view.MenuItem;  import android.view.MotionEvent; +import android.view.PhoneWindow;  import android.view.View;  import android.view.ViewGroup;  import android.view.Window; @@ -46,7 +47,6 @@ import android.view.WindowManager.LayoutParams;  import android.view.accessibility.AccessibilityEvent;  import android.util.MathUtils; -import com.android.internal.policy.PolicyManager;  import com.android.internal.util.DumpUtils;  import com.android.internal.util.DumpUtils.Dump; @@ -945,7 +945,7 @@ public class DreamService extends Service implements Window.Callback {              throw new IllegalStateException("Only doze dreams can be windowless");          }          if (!mWindowless) { -            mWindow = PolicyManager.makeNewWindow(this); +            mWindow = new PhoneWindow(this);              mWindow.setCallback(this);              mWindow.requestFeature(Window.FEATURE_NO_TITLE);              mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); diff --git a/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java b/core/java/android/view/PhoneFallbackEventHandler.java index f291e89f3154..fbf5732f93d6 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneFallbackEventHandler.java +++ b/core/java/android/view/PhoneFallbackEventHandler.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package android.view;  import android.app.KeyguardManager;  import android.app.SearchManager; @@ -23,19 +23,14 @@ import android.content.Context;  import android.content.Intent;  import android.content.res.Configuration;  import android.media.AudioManager; -import android.media.IAudioService;  import android.media.session.MediaSessionLegacyHelper; -import android.os.RemoteException; -import android.os.ServiceManager;  import android.os.UserHandle;  import android.telephony.TelephonyManager; -import android.util.Log;  import android.util.Slog; -import android.view.View; -import android.view.HapticFeedbackConstants; -import android.view.FallbackEventHandler; -import android.view.KeyEvent; +/** + * @hide + */  public class PhoneFallbackEventHandler implements FallbackEventHandler {      private static String TAG = "PhoneFallbackEventHandler";      private static final boolean DEBUG = false; @@ -283,7 +278,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler {      }      void sendCloseSystemWindows() { -        PhoneWindowManager.sendCloseSystemWindows(mContext, null); +        PhoneWindow.sendCloseSystemWindows(mContext, null);      }      private void handleMediaKeyEvent(KeyEvent keyEvent) { diff --git a/policy/src/com/android/internal/policy/impl/PhoneLayoutInflater.java b/core/java/android/view/PhoneLayoutInflater.java index df6fca4c7bc9..7d89a0b4bd2f 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneLayoutInflater.java +++ b/core/java/android/view/PhoneLayoutInflater.java @@ -14,37 +14,38 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package android.view;  import android.content.Context;  import android.util.AttributeSet; -import android.view.View; -import android.view.LayoutInflater; +/** + * @hide + */  public class PhoneLayoutInflater extends LayoutInflater {      private static final String[] sClassPrefixList = {          "android.widget.",          "android.webkit.",          "android.app."      }; -     +      /**       * Instead of instantiating directly, you should retrieve an instance       * through {@link Context#getSystemService} -     *  +     *       * @param context The Context in which in which to find resources and other       *                application-specific things. -     *  +     *       * @see Context#getSystemService       */      public PhoneLayoutInflater(Context context) {          super(context);      } -     +      protected PhoneLayoutInflater(LayoutInflater original, Context newContext) {          super(original, newContext);      } -     +      /** Override onCreateView to instantiate names that correspond to the          widgets known to the Widget factory. If we don't find a match,          call through to our super class. @@ -64,7 +65,7 @@ public class PhoneLayoutInflater extends LayoutInflater {          return super.onCreateView(name, attrs);      } -     +      public LayoutInflater cloneInContext(Context newContext) {          return new PhoneLayoutInflater(this, newContext);      } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/core/java/android/view/PhoneWindow.java index 6771988adbea..5f4d201e0f46 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/core/java/android/view/PhoneWindow.java @@ -13,7 +13,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package android.view;  import static android.view.View.MeasureSpec.AT_MOST;  import static android.view.View.MeasureSpec.EXACTLY; @@ -22,6 +22,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;  import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;  import static android.view.WindowManager.LayoutParams.*; +import android.app.ActivityManagerNative;  import android.app.SearchManager;  import android.os.UserHandle;  import com.android.internal.R; @@ -72,31 +73,6 @@ import android.util.EventLog;  import android.util.Log;  import android.util.SparseArray;  import android.util.TypedValue; -import android.view.ActionMode; -import android.view.ContextThemeWrapper; -import android.view.Display; -import android.view.Gravity; -import android.view.IRotationWatcher; -import android.view.IWindowManager; -import android.view.InputEvent; -import android.view.InputQueue; -import android.view.KeyCharacterMap; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewManager; -import android.view.ViewParent; -import android.view.ViewRootImpl; -import android.view.ViewStub; -import android.view.Window; -import android.view.WindowInsets; -import android.view.WindowManager;  import android.view.accessibility.AccessibilityEvent;  import android.view.accessibility.AccessibilityManager;  import android.view.animation.Animation; @@ -116,6 +92,8 @@ import java.util.ArrayList;   * <p>   * todo: need to pull the generic functionality out into a base class   * in android.widget. + * + * @hide   */  public class PhoneWindow extends Window implements MenuBuilder.Callback { @@ -1758,9 +1736,20 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {          switch (keyCode) {              case KeyEvent.KEYCODE_VOLUME_UP: -            case KeyEvent.KEYCODE_VOLUME_DOWN: { -                int direction = keyCode == KeyEvent.KEYCODE_VOLUME_UP ? AudioManager.ADJUST_RAISE -                        : AudioManager.ADJUST_LOWER; +            case KeyEvent.KEYCODE_VOLUME_DOWN: +            case KeyEvent.KEYCODE_VOLUME_MUTE: { +                int direction = 0; +                switch (keyCode) { +                    case KeyEvent.KEYCODE_VOLUME_UP: +                        direction = AudioManager.ADJUST_RAISE; +                        break; +                    case KeyEvent.KEYCODE_VOLUME_DOWN: +                        direction = AudioManager.ADJUST_LOWER; +                        break; +                    case KeyEvent.KEYCODE_VOLUME_MUTE: +                        direction = AudioManager.ADJUST_TOGGLE_MUTE; +                        break; +                }                  // If we have a session send it the volume command, otherwise                  // use the suggested stream.                  if (mMediaController != null) { @@ -1772,10 +1761,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {                  }                  return true;              } -            case KeyEvent.KEYCODE_VOLUME_MUTE: { -                getAudioManager().handleKeyDown(event, mVolumeControlStreamType); -                return true; -            }              // These are all the recognized media key codes in              // KeyEvent.isMediaKey()              case KeyEvent.KEYCODE_MEDIA_PLAY: @@ -4747,11 +4732,20 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {      }      void sendCloseSystemWindows() { -        PhoneWindowManager.sendCloseSystemWindows(getContext(), null); +        sendCloseSystemWindows(getContext(), null);      }      void sendCloseSystemWindows(String reason) { -        PhoneWindowManager.sendCloseSystemWindows(getContext(), reason); +        sendCloseSystemWindows(getContext(), reason); +    } + +    public static void sendCloseSystemWindows(Context context, String reason) { +        if (ActivityManagerNative.isSystemReady()) { +            try { +                ActivityManagerNative.getDefault().closeSystemDialogs(reason); +            } catch (RemoteException e) { +            } +        }      }      @Override diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 0e114ef6886d..e1cee1e3359b 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1933,12 +1933,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager              mInputEventConsistencyVerifier.onTouchEvent(ev, 1);          } -        // Whether this event should be handled by the accessibility focus first. -        final boolean targetAccessibilityFocus = ev.isTargetAccessibilityFocus(); -          // If the event targets the accessibility focused view and this is it, start          // normal event dispatch. Maybe a descendant is what will handle the click. -        if (targetAccessibilityFocus && isAccessibilityFocusedViewOrHost()) { +        if (ev.isTargetAccessibilityFocus() && isAccessibilityFocusedViewOrHost()) {              ev.setTargetAccessibilityFocus(false);          } @@ -1958,24 +1955,25 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager              // Check for interception.              final boolean intercepted; -            if (!targetAccessibilityFocus) { -                if (actionMasked == MotionEvent.ACTION_DOWN -                        || mFirstTouchTarget != null) { -                    final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; -                    if (!disallowIntercept) { -                        intercepted = onInterceptTouchEvent(ev); -                        ev.setAction(action); // restore action in case it was changed -                    } else { -                        intercepted = false; -                    } +            if (actionMasked == MotionEvent.ACTION_DOWN +                    || mFirstTouchTarget != null) { +                final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; +                if (!disallowIntercept) { +                    intercepted = onInterceptTouchEvent(ev); +                    ev.setAction(action); // restore action in case it was changed                  } else { -                    // There are no touch targets and this action is not an initial down -                    // so this view group continues to intercept touches. -                    intercepted = true; +                    intercepted = false;                  }              } else { -                // If event should reach the accessibility focus first, do not intercept it. -                intercepted = false; +                // There are no touch targets and this action is not an initial down +                // so this view group continues to intercept touches. +                intercepted = true; +            } + +            // If intercepted, start normal event dispatch. Also if there is already +            // a view that is handling the gesture, do normal event dispatch. +            if (intercepted || mFirstTouchTarget != null) { +                ev.setTargetAccessibilityFocus(false);              }              // Check for cancelation. @@ -1987,10 +1985,18 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager              TouchTarget newTouchTarget = null;              boolean alreadyDispatchedToNewTouchTarget = false;              if (!canceled && !intercepted) { + +                // If the event is targeting accessiiblity focus we give it to the +                // view that has accessibility focus and if it does not handle it +                // we clear the flag and dispatch the event to all children as usual. +                // We are looking up the accessibility focused host to avoid keeping +                // state since these events are very rare. +                View childWithAccessibilityFocus = ev.isTargetAccessibilityFocus() +                        ? findChildWithAccessibilityFocus() : null; +                  if (actionMasked == MotionEvent.ACTION_DOWN                          || (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN) -                        || actionMasked == MotionEvent.ACTION_HOVER_MOVE -                        || targetAccessibilityFocus) { +                        || actionMasked == MotionEvent.ACTION_HOVER_MOVE) {                      final int actionIndex = ev.getActionIndex(); // always 0 for down                      final int idBitsToAssign = split ? 1 << ev.getPointerId(actionIndex)                              : TouchTarget.ALL_POINTER_IDS; @@ -2014,8 +2020,22 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager                                      ? getChildDrawingOrder(childrenCount, i) : i;                              final View child = (preorderedList == null)                                      ? children[childIndex] : preorderedList.get(childIndex); + +                            // If there is a view that has accessibility focus we want it +                            // to get the event first and if not handled we will perform a +                            // normal dispatch. We may do a double iteration but this is +                            // safer given the timeframe. +                            if (childWithAccessibilityFocus != null) { +                                if (childWithAccessibilityFocus != child) { +                                    continue; +                                } +                                childWithAccessibilityFocus = null; +                                i = childrenCount - 1; +                            } +                              if (!canViewReceivePointerEvents(child)                                      || !isTransformedTouchPointInView(x, y, child, null)) { +                                ev.setTargetAccessibilityFocus(false);                                  continue;                              } @@ -2048,6 +2068,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager                                  alreadyDispatchedToNewTouchTarget = true;                                  break;                              } + +                            // The accessibility focus didn't handle the event, so clear +                            // the flag and do a normal dispatch to all children. +                            ev.setTargetAccessibilityFocus(false);                          }                          if (preorderedList != null) preorderedList.clear();                      } @@ -2120,6 +2144,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager      }      /** +     * Finds the child which has accessibility focus. +     * +     * @return The child that has focus. +     */ +    private View findChildWithAccessibilityFocus() { +        ViewRootImpl viewRoot = getViewRootImpl(); +        if (viewRoot == null) { +            return null; +        } + +        View current = viewRoot.getAccessibilityFocusedHost(); +        if (current == null) { +            return null; +        } + +        ViewParent parent = current.getParent(); +        while (parent instanceof View) { +            if (parent == this) { +                return current; +            } +            current = (View) parent; +            parent = current.getParent(); +        } + +        return null; +    } + +    /**       * Resets all touch state in preparation for a new cycle.       */      private void resetTouchState() { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 570cb7298943..fb2a8d88805f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -76,7 +76,6 @@ import android.widget.Scroller;  import com.android.internal.R;  import com.android.internal.os.SomeArgs; -import com.android.internal.policy.PolicyManager;  import com.android.internal.view.BaseSurfaceHolder;  import com.android.internal.view.RootViewSurfaceTaker; @@ -386,7 +385,7 @@ public final class ViewRootImpl implements ViewParent,          mViewConfiguration = ViewConfiguration.get(context);          mDensity = context.getResources().getDisplayMetrics().densityDpi;          mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; -        mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context); +        mFallbackEventHandler = new PhoneFallbackEventHandler(context);          mChoreographer = Choreographer.getInstance();          mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);          loadSystemProperties(); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 8704356e7471..1456b52cddcb 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -42,10 +42,8 @@ import android.view.accessibility.AccessibilityEvent;   * area, default key processing, etc.   *   * <p>The only existing implementation of this abstract class is - * android.policy.PhoneWindow, which you should instantiate when needing a - * Window.  Eventually that class will be refactored and a factory method - * added for creating Window instances without knowing about a particular - * implementation. + * android.view.PhoneWindow, which you should instantiate when needing a + * Window.   */  public abstract class Window {      /** Flag for the "options panel" feature.  This is enabled by default. */ diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java index 380b328f94cb..0b638436333a 100644 --- a/core/java/android/widget/MediaController.java +++ b/core/java/android/widget/MediaController.java @@ -28,6 +28,7 @@ import android.view.Gravity;  import android.view.KeyEvent;  import android.view.LayoutInflater;  import android.view.MotionEvent; +import android.view.PhoneWindow;  import android.view.View;  import android.view.ViewGroup;  import android.view.Window; @@ -36,8 +37,6 @@ import android.view.accessibility.AccessibilityEvent;  import android.view.accessibility.AccessibilityNodeInfo;  import android.widget.SeekBar.OnSeekBarChangeListener; -import com.android.internal.policy.PolicyManager; -  import java.util.Formatter;  import java.util.Locale; @@ -128,7 +127,7 @@ public class MediaController extends FrameLayout {      private void initFloatingWindow() {          mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); -        mWindow = PolicyManager.makeNewWindow(mContext); +        mWindow = new PhoneWindow(mContext);          mWindow.setWindowManager(mWindowManager, null, null);          mWindow.requestFeature(Window.FEATURE_NO_TITLE);          mDecor = mWindow.getDecorView(); diff --git a/core/java/com/android/internal/policy/IPolicy.java b/core/java/com/android/internal/policy/IPolicy.java deleted file mode 100644 index d08b3b4e9ad6..000000000000 --- a/core/java/com/android/internal/policy/IPolicy.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.policy; - -import android.content.Context; -import android.view.FallbackEventHandler; -import android.view.LayoutInflater; -import android.view.Window; -import android.view.WindowManagerPolicy; - -/** - * {@hide} - */ - -/* The implementation of this interface must be called Policy and contained - * within the com.android.internal.policy.impl package */ -public interface IPolicy { -    public Window makeNewWindow(Context context); - -    public LayoutInflater makeNewLayoutInflater(Context context); - -    public WindowManagerPolicy makeNewWindowManager(); - -    public FallbackEventHandler makeNewFallbackEventHandler(Context context); -} diff --git a/core/java/com/android/internal/policy/PolicyManager.java b/core/java/com/android/internal/policy/PolicyManager.java deleted file mode 100644 index 462b3a99850c..000000000000 --- a/core/java/com/android/internal/policy/PolicyManager.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.policy; - -import android.content.Context; -import android.view.FallbackEventHandler; -import android.view.LayoutInflater; -import android.view.Window; -import android.view.WindowManagerPolicy; - -/** - * {@hide} - */ - -public final class PolicyManager { -    private static final String POLICY_IMPL_CLASS_NAME = -        "com.android.internal.policy.impl.Policy"; - -    private static final IPolicy sPolicy; - -    static { -        // Pull in the actual implementation of the policy at run-time -        try { -            Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); -            sPolicy = (IPolicy)policyClass.newInstance(); -        } catch (ClassNotFoundException ex) { -            throw new RuntimeException( -                    POLICY_IMPL_CLASS_NAME + " could not be loaded", ex); -        } catch (InstantiationException ex) { -            throw new RuntimeException( -                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); -        } catch (IllegalAccessException ex) { -            throw new RuntimeException( -                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); -        } -    } - -    // Cannot instantiate this class -    private PolicyManager() {} - -    // The static methods to spawn new policy-specific objects -    public static Window makeNewWindow(Context context) { -        return sPolicy.makeNewWindow(context); -    } - -    public static LayoutInflater makeNewLayoutInflater(Context context) { -        return sPolicy.makeNewLayoutInflater(context); -    } - -    public static WindowManagerPolicy makeNewWindowManager() { -        return sPolicy.makeNewWindowManager(); -    } - -    public static FallbackEventHandler makeNewFallbackEventHandler(Context context) { -        return sPolicy.makeNewFallbackEventHandler(context); -    } -} diff --git a/core/res/res/color/btn_default_material_dark.xml b/core/res/res/color/btn_default_material_dark.xml index 9be1417dbb22..e77af374f862 100644 --- a/core/res/res/color/btn_default_material_dark.xml +++ b/core/res/res/color/btn_default_material_dark.xml @@ -16,7 +16,7 @@  <selector xmlns:android="http://schemas.android.com/apk/res/android">      <item android:state_enabled="false" -          android:alpha="@dimen/disabled_alpha_material_dark" +          android:alpha="?attr/disabledAlpha"            android:color="@color/button_material_dark"/>      <item android:color="@color/button_material_dark"/>  </selector> diff --git a/core/res/res/color/btn_default_material_light.xml b/core/res/res/color/btn_default_material_light.xml index af5afe6239c2..9fe5766304cd 100644 --- a/core/res/res/color/btn_default_material_light.xml +++ b/core/res/res/color/btn_default_material_light.xml @@ -16,7 +16,7 @@  <selector xmlns:android="http://schemas.android.com/apk/res/android">      <item android:state_enabled="false" -          android:alpha="@dimen/disabled_alpha_material_light" +          android:alpha="?attr/disabledAlpha"            android:color="@color/button_material_light"/>      <item android:color="@color/button_material_light"/>  </selector> diff --git a/core/res/res/drawable/btn_cab_done_material.xml b/core/res/res/color/control_checkable_material.xml index 36cc19653445..c8ef909cd53e 100644 --- a/core/res/res/drawable/btn_cab_done_material.xml +++ b/core/res/res/color/control_checkable_material.xml @@ -1,6 +1,5 @@  <?xml version="1.0" encoding="utf-8"?> -<!-- -     Copyright (C) 2014 The Android Open Source Project +<!-- Copyright (C) 2015 The Android Open Source Project       Licensed under the Apache License, Version 2.0 (the "License");       you may not use this file except in compliance with the License. @@ -15,17 +14,11 @@       limitations under the License.  --> -<selector xmlns:android="http://schemas.android.com/apk/res/android" -    android:autoMirrored="true"> -    <item android:state_pressed="true"> -        <color android:color="?attr/colorControlHighlight" /> -    </item> -    <item android:state_focused="true" android:state_enabled="true"> -        <nine-patch android:src="@drawable/btn_cab_done_mtrl_alpha" -            android:tint="?attr/colorControlHighlight" /> -    </item> -    <item android:state_enabled="true"> -        <nine-patch android:src="@drawable/btn_cab_done_mtrl_alpha" -            android:tint="?attr/colorButtonNormal" /> -    </item> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:state_enabled="false" +          android:alpha="?attr/disabledAlpha" +          android:color="?attr/colorControlNormal" /> +    <item android:state_checked="true" +          android:color="?attr/colorControlActivated" /> +    <item android:color="?attr/colorControlNormal" />  </selector> diff --git a/core/res/res/color/control_default_material.xml b/core/res/res/color/control_default_material.xml new file mode 100644 index 000000000000..901c6809bfd4 --- /dev/null +++ b/core/res/res/color/control_default_material.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + +     Licensed under the Apache License, Version 2.0 (the "License"); +     you may not use this file except in compliance with the License. +     You may obtain a copy of the License at + +          http://www.apache.org/licenses/LICENSE-2.0 + +     Unless required by applicable law or agreed to in writing, software +     distributed under the License is distributed on an "AS IS" BASIS, +     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +     See the License for the specific language governing permissions and +     limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:state_enabled="false" +          android:alpha="?attr/disabledAlpha" +          android:color="?attr/colorControlNormal" /> +    <item android:color="?attr/colorControlActivated" /> +</selector> diff --git a/core/res/res/color/switch_track_material.xml b/core/res/res/color/switch_track_material.xml new file mode 100644 index 000000000000..0c8caa92b6cc --- /dev/null +++ b/core/res/res/color/switch_track_material.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + +     Licensed under the Apache License, Version 2.0 (the "License"); +     you may not use this file except in compliance with the License. +     You may obtain a copy of the License at + +          http://www.apache.org/licenses/LICENSE-2.0 + +     Unless required by applicable law or agreed to in writing, software +     distributed under the License is distributed on an "AS IS" BASIS, +     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +     See the License for the specific language governing permissions and +     limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:state_enabled="false" +          android:color="?attr/colorForeground" +          android:alpha="?attr/disabledAlpha" /> +    <item android:state_checked="true" +          android:color="?attr/colorControlActivated" /> +    <item android:color="?attr/colorForeground" /> +</selector> diff --git a/core/res/res/color/tab_indicator_material.xml b/core/res/res/color/tab_indicator_material.xml new file mode 100644 index 000000000000..9602e9207457 --- /dev/null +++ b/core/res/res/color/tab_indicator_material.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + +     Licensed under the Apache License, Version 2.0 (the "License"); +     you may not use this file except in compliance with the License. +     You may obtain a copy of the License at + +          http://www.apache.org/licenses/LICENSE-2.0 + +     Unless required by applicable law or agreed to in writing, software +     distributed under the License is distributed on an "AS IS" BASIS, +     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +     See the License for the specific language governing permissions and +     limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:state_selected="true" +          android:color="@color/white" /> +    <item android:color="@color/transparent" /> +</selector> diff --git a/core/res/res/drawable-hdpi/btn_cab_done_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/btn_cab_done_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 992a8ff85dd8..000000000000 --- a/core/res/res/drawable-hdpi/btn_cab_done_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/btn_toggle_indicator_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/btn_toggle_indicator_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 68e17ad88371..000000000000 --- a/core/res/res/drawable-hdpi/btn_toggle_indicator_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/spinner_mtrl_am_alpha.9.png b/core/res/res/drawable-hdpi/spinner_mtrl_am_alpha.9.png Binary files differdeleted file mode 100644 index de7ac29d6aa7..000000000000 --- a/core/res/res/drawable-hdpi/spinner_mtrl_am_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 9415bc045b5e..000000000000 --- a/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/btn_cab_done_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/btn_cab_done_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 5903856d80e0..000000000000 --- a/core/res/res/drawable-mdpi/btn_cab_done_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/btn_toggle_indicator_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/btn_toggle_indicator_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index e5bfaced9bcb..000000000000 --- a/core/res/res/drawable-mdpi/btn_toggle_indicator_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/spinner_mtrl_am_alpha.9.png b/core/res/res/drawable-mdpi/spinner_mtrl_am_alpha.9.png Binary files differdeleted file mode 100644 index bbf59287fd8e..000000000000 --- a/core/res/res/drawable-mdpi/spinner_mtrl_am_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 4918d33fde0f..000000000000 --- a/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index d0d0b1e3ec6f..000000000000 --- a/core/res/res/drawable-xhdpi/btn_cab_done_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/btn_toggle_indicator_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/btn_toggle_indicator_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index dff391fe8c5c..000000000000 --- a/core/res/res/drawable-xhdpi/btn_toggle_indicator_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/spinner_mtrl_am_alpha.9.png b/core/res/res/drawable-xhdpi/spinner_mtrl_am_alpha.9.png Binary files differdeleted file mode 100644 index d4bd169b9d83..000000000000 --- a/core/res/res/drawable-xhdpi/spinner_mtrl_am_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index fd47f15e4bbd..000000000000 --- a/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/btn_cab_done_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/btn_cab_done_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index e1c55add43ad..000000000000 --- a/core/res/res/drawable-xxhdpi/btn_cab_done_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/btn_toggle_indicator_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/btn_toggle_indicator_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 0d6a39ad497c..000000000000 --- a/core/res/res/drawable-xxhdpi/btn_toggle_indicator_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/spinner_mtrl_am_alpha.9.png b/core/res/res/drawable-xxhdpi/spinner_mtrl_am_alpha.9.png Binary files differdeleted file mode 100644 index 2e7bc12c1e60..000000000000 --- a/core/res/res/drawable-xxhdpi/spinner_mtrl_am_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 3e3174d08c57..000000000000 --- a/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxxhdpi/btn_toggle_indicator_mtrl_alpha.9.png b/core/res/res/drawable-xxxhdpi/btn_toggle_indicator_mtrl_alpha.9.png Binary files differdeleted file mode 100755 index c06740bd8828..000000000000 --- a/core/res/res/drawable-xxxhdpi/btn_toggle_indicator_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxxhdpi/spinner_mtrl_am_alpha.9.png b/core/res/res/drawable-xxxhdpi/spinner_mtrl_am_alpha.9.png Binary files differdeleted file mode 100644 index 1086e9d6df8e..000000000000 --- a/core/res/res/drawable-xxxhdpi/spinner_mtrl_am_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 1e4a74c8a9e8..000000000000 --- a/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable/btn_check_material_anim.xml b/core/res/res/drawable/btn_check_material_anim.xml index 1e05e84fb95b..24df879ce393 100644 --- a/core/res/res/drawable/btn_check_material_anim.xml +++ b/core/res/res/drawable/btn_check_material_anim.xml @@ -16,118 +16,156 @@  <animated-selector xmlns:android="http://schemas.android.com/apk/res/android">      <item android:state_enabled="false" android:state_checked="true"> -        <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" android:tint="?attr/colorControlActivated" android:alpha="?attr/disabledAlpha" /> +        <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" +                android:tint="?attr/colorControlNormal" +                android:alpha="?attr/disabledAlpha" />      </item>      <item android:state_enabled="false"> -        <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlNormal" android:alpha="?attr/disabledAlpha" /> +        <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" +                android:tint="?attr/colorControlNormal" +                android:alpha="?attr/disabledAlpha" />      </item>      <item android:state_checked="true" android:id="@+id/on"> -        <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" android:tint="?attr/colorControlActivated" /> +        <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" +                android:tint="?attr/colorControlActivated" />      </item>      <item android:id="@+id/off"> -        <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlNormal" /> +        <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" +                android:tint="?attr/colorControlNormal" />      </item>      <transition android:fromId="@+id/off" android:toId="@+id/on">          <animation-list>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_001" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_001" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_002" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_002" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_003" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_003" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_004" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_004" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_005" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_005" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_006" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_006" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_007" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_007" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_008" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_008" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_009" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_009" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_010" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_010" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_011" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_011" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_012" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_012" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_013" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_013" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_014" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_014" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" +                        android:tint="?attr/colorControlActivated" />              </item>          </animation-list>      </transition>      <transition android:fromId="@+id/on" android:toId="@+id/off">          <animation-list>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_000" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_000" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_001" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_001" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_002" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_002" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_003" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_003" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_004" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_004" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_005" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_005" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_006" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_006" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_007" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_007" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_008" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_008" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_009" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_009" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_010" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_010" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_011" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_011" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_012" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_012" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_013" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_013" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_014" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_014" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_check_to_off_mtrl_015" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_check_to_off_mtrl_015" +                        android:tint="?attr/colorControlNormal" />              </item>          </animation-list>      </transition> diff --git a/core/res/res/drawable/btn_radio_material_anim.xml b/core/res/res/drawable/btn_radio_material_anim.xml index 121e5447798e..bce579eb296b 100644 --- a/core/res/res/drawable/btn_radio_material_anim.xml +++ b/core/res/res/drawable/btn_radio_material_anim.xml @@ -16,128 +16,156 @@  <animated-selector xmlns:android="http://schemas.android.com/apk/res/android">      <item android:state_enabled="false" android:state_checked="true"> -        <bitmap -            android:src="@drawable/btn_radio_to_on_mtrl_015" -            android:tint="?attr/colorControlActivated" -            android:alpha="?attr/disabledAlpha" /> +        <bitmap android:src="@drawable/btn_radio_to_on_mtrl_015" +                android:tint="?attr/colorControlNormal" +                android:alpha="?attr/disabledAlpha" />      </item>      <item android:state_enabled="false"> -        <bitmap -            android:src="@drawable/btn_radio_to_on_mtrl_000" -            android:tint="?attr/colorControlNormal" -            android:alpha="?attr/disabledAlpha" /> +        <bitmap android:src="@drawable/btn_radio_to_on_mtrl_000" +                android:tint="?attr/colorControlNormal" +                android:alpha="?attr/disabledAlpha" />      </item>      <item android:state_checked="true" android:id="@+id/on"> -        <bitmap -            android:src="@drawable/btn_radio_to_on_mtrl_015" -            android:tint="?attr/colorControlActivated" /> +        <bitmap android:src="@drawable/btn_radio_to_on_mtrl_015" +                android:tint="?attr/colorControlActivated" />      </item>      <item android:id="@+id/off"> -        <bitmap -            android:src="@drawable/btn_radio_to_on_mtrl_000" -            android:tint="?attr/colorControlNormal" /> +        <bitmap android:src="@drawable/btn_radio_to_on_mtrl_000" +                android:tint="?attr/colorControlNormal" />      </item>      <transition android:fromId="@+id/off" android:toId="@+id/on">          <animation-list>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_000" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_000" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_001" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_001" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_002" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_002" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_003" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_003" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_004" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_004" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_005" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_005" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_006" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_006" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_007" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_007" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_008" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_008" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_009" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_009" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_010" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_010" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_011" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_011" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_012" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_012" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_013" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_013" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_014" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_014" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_015" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_on_mtrl_015" +                        android:tint="?attr/colorControlActivated" />              </item>          </animation-list>      </transition>      <transition android:fromId="@+id/on" android:toId="@+id/off">          <animation-list>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_000" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_000" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_001" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_001" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_002" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_002" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_003" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_003" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_004" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_004" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_005" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_005" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_006" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_006" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_007" android:tint="?attr/colorControlActivated" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_007" +                        android:tint="?attr/colorControlActivated" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_008" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_008" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_009" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_009" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_010" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_010" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_011" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_011" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_012" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_012" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_013" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_013" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_014" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_014" +                        android:tint="?attr/colorControlNormal" />              </item>              <item android:duration="15"> -                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_015" android:tint="?attr/colorControlNormal" /> +                <bitmap android:src="@drawable/btn_radio_to_off_mtrl_015" +                        android:tint="?attr/colorControlNormal" />              </item>          </animation-list>      </transition> diff --git a/core/res/res/drawable/btn_star_material.xml b/core/res/res/drawable/btn_star_material.xml index 29862d282fd2..cbea471f7b1f 100644 --- a/core/res/res/drawable/btn_star_material.xml +++ b/core/res/res/drawable/btn_star_material.xml @@ -14,17 +14,6 @@       limitations under the License.  --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_checked="true"> -        <bitmap android:src="@drawable/btn_star_mtrl_alpha" -            android:tint="?attr/colorControlActivated" /> -    </item> -    <item android:state_pressed="true"> -        <bitmap android:src="@drawable/btn_star_mtrl_alpha" -            android:tint="?attr/colorControlActivated" /> -    </item> -    <item> -        <bitmap android:src="@drawable/btn_star_mtrl_alpha" -            android:tint="?attr/colorControlNormal" /> -    </item> -</selector> +<bitmap xmlns:android="http://schemas.android.com/apk/res/android" +        android:src="@drawable/btn_star_mtrl_alpha" +        android:tint="@color/control_checkable_material" /> diff --git a/core/res/res/drawable/btn_toggle_material.xml b/core/res/res/drawable/btn_toggle_material.xml index f91d4cc0cde9..8b19e4ae3561 100644 --- a/core/res/res/drawable/btn_toggle_material.xml +++ b/core/res/res/drawable/btn_toggle_material.xml @@ -23,11 +23,11 @@          <item>              <ripple android:color="?attr/colorControlHighlight">                  <item> -                    <shape xmlns:android="http://schemas.android.com/apk/res/android" -                           android:shape="rectangle"> +                    <shape android:shape="rectangle" +                           android:tint="?attr/colorButtonNormal">                          <corners android:topLeftRadius="@dimen/control_corner_material"                                   android:topRightRadius="@dimen/control_corner_material"/> -                        <solid android:color="?attr/colorButtonNormal" /> +                        <solid android:color="@color/white" />                          <padding android:left="@dimen/button_padding_horizontal_material"                                   android:top="@dimen/button_padding_vertical_material"                                   android:right="@dimen/button_padding_horizontal_material" @@ -36,17 +36,11 @@                  </item>              </ripple>          </item> -        <item> -            <selector xmlns:android="http://schemas.android.com/apk/res/android"> -                <item android:state_checked="false"> -                    <nine-patch android:src="@drawable/btn_toggle_indicator_mtrl_alpha" -                        android:tint="?attr/colorControlNormal" /> -                </item> -                <item android:state_checked="true"> -                    <nine-patch android:src="@drawable/btn_toggle_indicator_mtrl_alpha" -                        android:tint="?attr/colorControlActivated" /> -                </item> -            </selector> +        <item android:gravity="bottom|fill_horizontal"> +            <shape android:shape="rectangle"> +                <size android:height="2dp" /> +                <solid android:color="@color/control_checkable_material" /> +            </shape>          </item>      </layer-list>  </inset> diff --git a/core/res/res/drawable/spinner_background_material.xml b/core/res/res/drawable/spinner_background_material.xml index d99e367f576e..d5b509f7052c 100644 --- a/core/res/res/drawable/spinner_background_material.xml +++ b/core/res/res/drawable/spinner_background_material.xml @@ -14,19 +14,22 @@       limitations under the License.  --> -<selector xmlns:android="http://schemas.android.com/apk/res/android" -    android:autoMirrored="true"> -    <item android:state_enabled="false"> -        <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -            android:tint="?attr/colorControlNormal" -            android:alpha="?attr/disabledAlpha" /> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android" +            android:paddingMode="stack"> +    <item android:drawable="@drawable/item_background_borderless_material" +          android:gravity="end|center_vertical" +          android:width="24dp" +          android:height="24dp" /> +    <item android:gravity="end|center_vertical"> +        <vector android:width="24dp" +                android:height="24dp" +                android:viewportWidth="24.0" +                android:viewportHeight="24.0" +                android:tint="?attr/colorControlNormal"> +            <path android:pathData="M7,10l5,5,5-5z" +                  android:fillColor="@color/white"/> +        </vector>      </item> -    <item android:state_pressed="false" android:state_focused="false"> -        <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -            android:tint="?attr/colorControlNormal" /> -    </item> -    <item> -        <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -            android:tint="?attr/colorControlActivated" /> -    </item> -</selector> +    <item android:end="48dp" +          android:drawable="@color/transparent" /> +</layer-list> diff --git a/core/res/res/drawable/spinner_textfield_background_material.xml b/core/res/res/drawable/spinner_textfield_background_material.xml index fab3dc9b317c..69c2f30e2eed 100644 --- a/core/res/res/drawable/spinner_textfield_background_material.xml +++ b/core/res/res/drawable/spinner_textfield_background_material.xml @@ -14,46 +14,8 @@       limitations under the License.  --> -<inset xmlns:android="http://schemas.android.com/apk/res/android" -       android:inset="@dimen/control_inset_material"> -    <selector android:autoMirrored="true"> -        <item android:state_enabled="false"> -            <layer-list android:paddingMode="stack"> -                <item> -                    <nine-patch android:src="@drawable/textfield_activated_mtrl_alpha" -                        android:tint="?attr/colorControlActivated" -                        android:alpha="?attr/disabledAlpha" /> -                </item> -                <item> -                    <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -                        android:tint="?attr/colorControlActivated" -                        android:alpha="?attr/disabledAlpha" /> -                </item> -            </layer-list> -        </item> -        <item android:state_pressed="false" android:state_focused="false"> -            <layer-list android:paddingMode="stack"> -                <item> -                    <nine-patch android:src="@drawable/textfield_default_mtrl_alpha" -                        android:tint="?attr/colorControlNormal" /> -                </item> -                <item> -                    <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -                        android:tint="?attr/colorControlNormal" /> -                </item> -            </layer-list> -        </item> -        <item> -            <layer-list android:paddingMode="stack"> -                <item> -                    <nine-patch android:src="@drawable/textfield_activated_mtrl_alpha" -                        android:tint="?attr/colorControlActivated" /> -                </item> -                <item> -                    <nine-patch android:src="@drawable/spinner_mtrl_am_alpha" -                        android:tint="?attr/colorControlActivated" /> -                </item> -            </layer-list> -        </item> -    </selector> -</inset> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android" +            android:paddingMode="stack"> +    <item android:drawable="@drawable/edit_text_material" /> +    <item android:drawable="@drawable/spinner_background_material" /> +</layer-list> diff --git a/core/res/res/drawable/switch_track_material.xml b/core/res/res/drawable/switch_track_material.xml index 1ec2f88ed0c8..a825fe444918 100644 --- a/core/res/res/drawable/switch_track_material.xml +++ b/core/res/res/drawable/switch_track_material.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<!-- Copyright (C) 2015 The Android Open Source Project       Licensed under the Apache License, Version 2.0 (the "License");       you may not use this file except in compliance with the License. @@ -14,20 +14,15 @@       limitations under the License.  --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_enabled="false"> -        <nine-patch android:src="@drawable/switch_track_mtrl_alpha" -            android:tint="?attr/colorForeground" -            android:alpha="0.1" /> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:gravity="center_vertical|fill_horizontal" +          android:start="2dp" +          android:end="2dp"> +        <shape android:shape="rectangle" +               android:tint="@color/switch_track_material"> +            <corners android:radius="7dp" /> +            <solid android:color="#4dffffff" /> +            <size android:height="14dp" /> +        </shape>      </item> -    <item android:state_checked="true"> -        <nine-patch android:src="@drawable/switch_track_mtrl_alpha" -            android:tint="?attr/colorControlActivated" -            android:alpha="0.3" /> -    </item> -    <item> -        <nine-patch android:src="@drawable/switch_track_mtrl_alpha" -            android:tint="?attr/colorForeground" -            android:alpha="0.3" /> -    </item> -</selector> +</layer-list> diff --git a/core/res/res/drawable/tab_indicator_material.xml b/core/res/res/drawable/tab_indicator_material.xml index 16362c076474..fc52305eb67e 100644 --- a/core/res/res/drawable/tab_indicator_material.xml +++ b/core/res/res/drawable/tab_indicator_material.xml @@ -14,10 +14,14 @@       limitations under the License.  --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_selected="true"> -        <nine-patch android:src="@drawable/tab_indicator_mtrl_alpha" -            android:tint="?attr/colorControlActivated" /> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> +    <item android:gravity="bottom"> +        <shape android:shape="rectangle" +               android:tint="?attr/colorControlActivated"> +            <size android:height="2dp" /> +            <solid android:color="@color/tab_indicator_material" /> +        </shape>      </item> -    <item android:drawable="@color/transparent" /> -</selector> +    <item android:bottom="2dp" +          android:drawable="@color/transparent" /> +</layer-list> diff --git a/core/res/res/drawable/textfield_search_material.xml b/core/res/res/drawable/textfield_search_material.xml index 1c0f5eb04f88..fcd057931e2a 100644 --- a/core/res/res/drawable/textfield_search_material.xml +++ b/core/res/res/drawable/textfield_search_material.xml @@ -15,28 +15,20 @@  -->  <selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_window_focused="false" android:state_enabled="true"> -        <nine-patch android:src="@drawable/textfield_search_default_mtrl_alpha" -            android:tint="?attr/colorControlNormal" /> -    </item> -    <item android:state_window_focused="false" android:state_enabled="false"> -        <nine-patch android:src="@drawable/textfield_search_default_mtrl_alpha" -            android:tint="?attr/colorControlNormal" /> -    </item> -    <item android:state_enabled="true" android:state_focused="true"> +    <item android:state_window_focused="true" +          android:state_enabled="true" +          android:state_focused="true">          <nine-patch android:src="@drawable/textfield_search_activated_mtrl_alpha" -            android:tint="?attr/colorControlActivated" /> +                    android:tint="?attr/colorControlActivated" />      </item> -    <item android:state_enabled="true" android:state_activated="true"> +    <item android:state_window_focused="true" +          android:state_enabled="true" +          android:state_activated="true">          <nine-patch android:src="@drawable/textfield_search_activated_mtrl_alpha" -            android:tint="?attr/colorControlActivated" /> -    </item> -    <item android:state_enabled="true"> -        <nine-patch android:src="@drawable/textfield_search_default_mtrl_alpha" -            android:tint="?attr/colorControlNormal" /> +                    android:tint="?attr/colorControlActivated" />      </item>      <item>          <nine-patch android:src="@drawable/textfield_search_default_mtrl_alpha" -            android:tint="?attr/colorControlNormal" /> +                    android:tint="?attr/colorControlNormal" />      </item>  </selector> diff --git a/core/res/res/drawable/time_picker_header_material.xml b/core/res/res/drawable/time_picker_header_material.xml index cdb92b646a92..ef2068a2f626 100644 --- a/core/res/res/drawable/time_picker_header_material.xml +++ b/core/res/res/drawable/time_picker_header_material.xml @@ -15,8 +15,6 @@  -->  <ripple xmlns:android="http://schemas.android.com/apk/res/android" -    android:color="?attr/colorControlHighlight"> -    <item> -        <color android:color="?attr/colorAccent" /> -    </item> +        android:color="?attr/colorControlHighlight"> +    <item android:drawable="?attr/colorAccent" />  </ripple> diff --git a/core/res/res/values-af/donottranslate-cldr.xml b/core/res/res/values-af/donottranslate-cldr.xml index 7da5a7286944..c7f41b4c61e1 100755 --- a/core/res/res/values-af/donottranslate-cldr.xml +++ b/core/res/res/values-af/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 4eed141dbdc4..7c4c2d09eea7 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is AF"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Stembystand"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Sluit nou"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android begin tans …"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimeer tans berging."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimeer program <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Berei tans <xliff:g id="APPNAME">%1$s</xliff:g> voor."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Begin programme."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Voltooi herlaai."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> loop"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kon nie aan Wi-Fikoppel nie"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" het \'n swak internetverbinding."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Laat verbinding toe?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Program %1$s wil aan Wi-Fi-netwerk %2$s koppel"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"\'n Program"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Begin Wi-Fi Direct. Dit sal die Wi-Fi-kliënt/warmkol afskakel."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-versoek is gewysig tot DIAL-versoek."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-versoek is gewysig tot USSD-versoek."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-versoek is gewysig tot nuwe SS-versoek."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB-randpoort"</string>  </resources> diff --git a/core/res/res/values-am/donottranslate-cldr.xml b/core/res/res/values-am/donottranslate-cldr.xml index ea1975c2a00e..6afe07fb23ae 100755 --- a/core/res/res/values-am/donottranslate-cldr.xml +++ b/core/res/res/values-am/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %b %-e %Y</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 036abe14df59..a94674159684 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"የአውሮፕላንሁነታ በርቷል"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"የአውሮፕላንሁነታ ጠፍቷል"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"አሁን ቆልፍ"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string> diff --git a/core/res/res/values-ar-rEG/donottranslate-cldr.xml b/core/res/res/values-ar-rEG/donottranslate-cldr.xml index d625752b7b81..1be9ed8bc8b8 100755 --- a/core/res/res/values-ar-rEG/donottranslate-cldr.xml +++ b/core/res/res/values-ar-rEG/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B، %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string> diff --git a/core/res/res/values-ar/donottranslate-cldr.xml b/core/res/res/values-ar/donottranslate-cldr.xml index d625752b7b81..1be9ed8bc8b8 100755 --- a/core/res/res/values-ar/donottranslate-cldr.xml +++ b/core/res/res/values-ar/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B، %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 2a4c65c762a1..860b8a060d26 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"وضع الطائرة قيد التشغيل"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقف"</string>      <string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"المساعد الصوتي"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"قفل الآن"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"جارٍ تشغيل Android…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"جارٍ تحسين السعة التخزينية."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"جارٍ تحسين التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"جارٍ تحضير <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"بدء التطبيقات."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"جارٍ إعادة التشغيل."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"تعذر الاتصال بـ Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" لديها اتصال إنترنت رديء."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"هل تريد السماح بالاتصال؟"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"يريد تطبيق %1$s الاتصال بشبكة Wifi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"تطبيق"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"اتصال Wi-Fi مباشر"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ابدأ Wi-Fi Direct. يؤدي هذا إلى إيقاف عميل/نقطة اتصال Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"يتم تعديل الطلب SS لطلب الاتصال."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"يتم تعديل طلب SS إلى طلب USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"يتم تعديل طلب SS إلى طلب SS الجديد."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"منفذ الأجهزة الطرفية المزودة بكابل USB"</string>  </resources> diff --git a/core/res/res/values-bg/donottranslate-cldr.xml b/core/res/res/values-bg/donottranslate-cldr.xml index 1943517c947a..7c5ba7cdf131 100755 --- a/core/res/res/values-bg/donottranslate-cldr.xml +++ b/core/res/res/values-bg/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 0808af84fd48..9f572cf80e58 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Самолетният режим е ВКЛЮЧЕН"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Самолетният режим е ИЗКЛЮЧЕН"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Заключване сега"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android се стартира…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хранилището се оптимизира."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизира се приложение <xliff:g id="NUMBER_0">%1$d</xliff:g> от <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> се подготвя."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Приложенията се стартират."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Зареждането завършва."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не можа да се свърже с Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лоша връзка с интернет."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Да се разреши ли връзката?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Приложението %1$s иска да се свърже с Wi-Fi мрежата „%2$s“"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Приложение"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Стартиране на Wi-Fi Direct. Това ще изключи клиентската програма/точката за достъп до Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS заявката е променена на DIAL заявка."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS заявката е променена на USSD заявка."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS заявката е променена на нова SS заявка."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Периферен USB порт"</string>  </resources> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index bc61458a5a22..9f79384cdc06 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"বিমান মোড চালু করা আছে"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"বিমান মোড বন্ধ করা আছে"</string>      <string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"এখনই লক করুন"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string>      <string name="safeMode" msgid="2788228061547930246">"নিরাপদ মোড"</string> diff --git a/core/res/res/values-ca/donottranslate-cldr.xml b/core/res/res/values-ca/donottranslate-cldr.xml index 13f623baf05e..db2d1ec964a9 100755 --- a/core/res/res/values-ca/donottranslate-cldr.xml +++ b/core/res/res/values-ca/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B de %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S %d/%m/%Y</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 2a087b5d4afc..3f68244895fa 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode d\'avió activat"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode d\'avió desactivat"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. per veu"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloqueja ara"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string>      <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> diff --git a/core/res/res/values-cs/donottranslate-cldr.xml b/core/res/res/values-cs/donottranslate-cldr.xml index 765c51e05da3..51f7e38e1e6a 100755 --- a/core/res/res/values-cs/donottranslate-cldr.xml +++ b/core/res/res/values-cs/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s. %s. %s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S %-e. %-m. %Y</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8e485bd6de9e..00913d266750 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim Letadlo je ZAPNUTÝ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim Letadlo je VYPNUTÝ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Nastavení"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Zamknout"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Spouštění systému Android…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Probíhá optimalizace úložiště."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimalizování aplikace <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Příprava aplikace <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Spouštění aplikací."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončování inicializace."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Běží aplikace <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Připojení k síti Wi-Fi se nezdařilo"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má pomalé připojení k internetu."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povolit připojení?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikace %1$s se chce připojit k síti Wi-Fi %2$s."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikace"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Přímé připojení sítě Wi-Fi"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustit přímé připojení sítě Wi-Fi. Tato možnost vypne provoz sítě Wi-Fi v režimu klient/hotspot."</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Požadavek SS byl změněn na požadavek DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Požadavek SS byl změněn na požadavek USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Požadavek SS byl změněn na nový požadavek SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port USB pro periferní zařízení"</string>  </resources> diff --git a/core/res/res/values-da/donottranslate-cldr.xml b/core/res/res/values-da/donottranslate-cldr.xml index 4c7a78190bcd..af352577905e 100755 --- a/core/res/res/values-da/donottranslate-cldr.xml +++ b/core/res/res/values-da/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S, %-e. %b %Y</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index bdb65a9a2f76..157d282a2301 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nu"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string> diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml index 1fa067f04d42..d641e10e2b9b 100755 --- a/core/res/res/values-de/donottranslate-cldr.xml +++ b/core/res/res/values-de/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d.%m.%Y, %H:%M:%S</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 14717c0c2d55..5605cccc09e7 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flugmodus ist AN."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flugmodus ist AUS."</string>      <string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Sprachassistent"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Jetzt sperren"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android wird gestartet…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Speicher wird optimiert"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> von <xliff:g id="NUMBER_1">%2$d</xliff:g> wird optimiert..."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> wird vorbereitet"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps werden gestartet..."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Start wird abgeschlossen..."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Es konnte keine WLAN-Verbindung hergestellt werden."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" hat eine schlechte Internetverbindung."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Verbindung zulassen?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Die App \"%1$s\" möchte eine Verbindung zum WLAN-Netzwerk %2$s herstellen."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Eine App"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct-Betrieb starten. Hierdurch wird der WLAN-Client-/-Hotspot-Betrieb deaktiviert."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-Anfrage wird in DIAL-Anfrage geändert."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-Anfrage wird in USSD-Anfrage geändert."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-Anfrage wird in neue SS-Anfrage geändert."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB-Port für Peripheriegeräte"</string>  </resources> diff --git a/core/res/res/values-el/donottranslate-cldr.xml b/core/res/res/values-el/donottranslate-cldr.xml index 7da5a7286944..c7f41b4c61e1 100755 --- a/core/res/res/values-el/donottranslate-cldr.xml +++ b/core/res/res/values-el/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 94d16cf2b24f..9229bc67dde2 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Λειτ. πτήσης είναι ανενεργή"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Φων.υποβοηθ."</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Κλείδωμα τώρα"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string> diff --git a/core/res/res/values-en-rAU/donottranslate-cldr.xml b/core/res/res/values-en-rAU/donottranslate-cldr.xml index a7c07d317fde..69c3aea0d84e 100755 --- a/core/res/res/values-en-rAU/donottranslate-cldr.xml +++ b/core/res/res/values-en-rAU/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%d/%m/%Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values-en-rCA/donottranslate-cldr.xml b/core/res/res/values-en-rCA/donottranslate-cldr.xml index b632f8150272..57b80dfc157d 100755 --- a/core/res/res/values-en-rCA/donottranslate-cldr.xml +++ b/core/res/res/values-en-rCA/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%B %-e, %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%Y-%m-%d, %-l:%M:%S %p</string> diff --git a/core/res/res/values-en-rGB/donottranslate-cldr.xml b/core/res/res/values-en-rGB/donottranslate-cldr.xml index d099376a1149..db438f22208f 100755 --- a/core/res/res/values-en-rGB/donottranslate-cldr.xml +++ b/core/res/res/values-en-rGB/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%-e %b %Y, %H:%M:%S</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 643e1906cc00..f7f62e9d2c52 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Settings"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> diff --git a/core/res/res/values-en-rIE/donottranslate-cldr.xml b/core/res/res/values-en-rIE/donottranslate-cldr.xml index d099376a1149..db438f22208f 100755 --- a/core/res/res/values-en-rIE/donottranslate-cldr.xml +++ b/core/res/res/values-en-rIE/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%-e %b %Y, %H:%M:%S</string> diff --git a/core/res/res/values-en-rIN/donottranslate-cldr.xml b/core/res/res/values-en-rIN/donottranslate-cldr.xml index 1d9470c6b00e..84157fe10a69 100755 --- a/core/res/res/values-en-rIN/donottranslate-cldr.xml +++ b/core/res/res/values-en-rIN/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%d-%b-%Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 643e1906cc00..f7f62e9d2c52 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Settings"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> diff --git a/core/res/res/values-en-rNZ/donottranslate-cldr.xml b/core/res/res/values-en-rNZ/donottranslate-cldr.xml index a4ff35792a0c..4e9bec6c7417 100755 --- a/core/res/res/values-en-rNZ/donottranslate-cldr.xml +++ b/core/res/res/values-en-rNZ/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-e/%m/%Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values-en-rUS/donottranslate-cldr.xml b/core/res/res/values-en-rUS/donottranslate-cldr.xml index 80db6e434542..a8e2b2bc3246 100755 --- a/core/res/res/values-en-rUS/donottranslate-cldr.xml +++ b/core/res/res/values-en-rUS/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%B %-e, %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%b %-e, %Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values-en-rZA/donottranslate-cldr.xml b/core/res/res/values-en-rZA/donottranslate-cldr.xml index 7c276041d2c4..a4a530884b11 100755 --- a/core/res/res/values-en-rZA/donottranslate-cldr.xml +++ b/core/res/res/values-en-rZA/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%d %b %Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values-es-rUS/donottranslate-cldr.xml b/core/res/res/values-es-rUS/donottranslate-cldr.xml index 878b48f1af77..8adac31fc3dd 100755 --- a/core/res/res/values-es-rUS/donottranslate-cldr.xml +++ b/core/res/res/values-es-rUS/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e de %B de %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index a35ad8d89705..5c8e65c92245 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Activado"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Desactivado"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear ahora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Iniciando Android…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando la aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando el inicio"</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se pudo conectar a la red Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una mala conexión a Internet."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"La aplicación %1$s quiere conectarse a la red Wi-Fi %2$s."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Una aplicación"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar Wi-Fi Direct. Se desactivará el funcionamiento de la zona o del cliente Wi-Fi."</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La solicitud SS cambió por una solicitud DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS cambió por una solicitud USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS cambió por una nueva solicitud SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Puerto USB de periféricos"</string>  </resources> diff --git a/core/res/res/values-es/donottranslate-cldr.xml b/core/res/res/values-es/donottranslate-cldr.xml index d73a715532bf..ca16aa0abca0 100755 --- a/core/res/res/values-es/donottranslate-cldr.xml +++ b/core/res/res/values-es/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e de %B de %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d/%m/%Y, %H:%M:%S</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index d56a893a97ce..f06832dabb98 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear ahora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string>      <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android se está iniciando…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>..."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando inicio..."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se ha podido establecer conexión con la red Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una conexión inestable a Internet."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"La aplicación %1$s quiere establecer conexión con la red Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Una aplicación"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar Wi-Fi Direct. Se desactivará el funcionamiento de la zona o del cliente Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La solicitud SS se ha modificado para la solicitud DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS se ha modificado para la solicitud USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS se ha modificado para la nueva solicitud SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Puerto periférico USB"</string>  </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index eec356accf3e..5a8e0a062344 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lennurežiim on SEES"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lennurežiim on VÄLJAS"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lukusta kohe"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index bf2b274cf1f1..e2369ea58844 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hegaldi modua AKTIBATUTA dago"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hegaldi modua DESAKTIBATUTA dago"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Ezarpenak"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Ahots-laguntza"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Blokeatu"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Modu segurua"</string> diff --git a/core/res/res/values-fa/donottranslate-cldr.xml b/core/res/res/values-fa/donottranslate-cldr.xml index bb77b31e1693..2821cd5d90c4 100755 --- a/core/res/res/values-fa/donottranslate-cldr.xml +++ b/core/res/res/values-fa/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S، %Y/%-m/%-e</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 7a71ceb29a1a..547f432e7562 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"حالت هواپیما روشن است"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"حالت هواپیما خاموش است"</string>      <string name="global_action_settings" msgid="1756531602592545966">"تنظیمات"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"اکنون قفل شود"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string>      <string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android در حال راهاندازی است..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"بهینهسازی فضای ذخیرهسازی."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینهسازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"آمادهسازی <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"اتصال به Wi-Fi ممکن نیست"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اتصال اینترنتی ضعیفی دارد."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"اتصال اجازه داده شود؟"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"برنامه %1$s میخواهد به شبکه Wifi %2$s وصل شود"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"برنامه"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct را شروع کنید. این کار نقطه اتصال/سرویس گیرنده Wi-Fi را غیرفعال خواهد کرد."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"درخواست SS به درخواست DIAL اصلاح میشود."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"درخواست SS به درخواست USSD اصلاح میشود."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"درخواست SS به درخواست SS جدید اصلاح میشود."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"درگاه جانبی USB"</string>  </resources> diff --git a/core/res/res/values-fi-rFI/donottranslate-cldr.xml b/core/res/res/values-fi-rFI/donottranslate-cldr.xml index 8e8c640b295b..eab4957946d0 100755 --- a/core/res/res/values-fi-rFI/donottranslate-cldr.xml +++ b/core/res/res/values-fi-rFI/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%-k.%M.%S</string>      <string name="date_and_time">%-k.%M.%S %-e.%-m.%Y</string> diff --git a/core/res/res/values-fi/donottranslate-cldr.xml b/core/res/res/values-fi/donottranslate-cldr.xml index 8e8c640b295b..eab4957946d0 100755 --- a/core/res/res/values-fi/donottranslate-cldr.xml +++ b/core/res/res/values-fi/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%-k.%M.%S</string>      <string name="date_and_time">%-k.%M.%S %-e.%-m.%Y</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index feb93d929343..f5ef513cee4a 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lentokonetila on KÄYTÖSSÄ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lentokonetila on POIS KÄYTÖSTÄ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Asetukset"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Lukitse nyt"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index a71d6162ad04..9a9ab320839c 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>      <string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. vocale"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Verrouiller"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android en cours de démarrage..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossible de se connecter au Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" dispose d\'une mauvaise connexion Internet."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"L\'application %1$s souhaite se connecter au réseau Wi-Fi %2$s."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Une application"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Lancer le Wi-Fi Direct. Cela désactive le fonctionnement du Wi-Fi client ou via un point d\'accès."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La demande SS a été modifiée et est maintenant une demande DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La demande SS a été modifiée et est maintenant une demande USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La demande SS a été modifiée et est maintenant une nouvelle demande SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port USB"</string>  </resources> diff --git a/core/res/res/values-fr/donottranslate-cldr.xml b/core/res/res/values-fr/donottranslate-cldr.xml index 5fc3539c0f3e..2d6a109fd9f4 100755 --- a/core/res/res/values-fr/donottranslate-cldr.xml +++ b/core/res/res/values-fr/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%-e %b %Y à %H:%M:%S</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 83df48da578a..4ba1aaed6a85 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>      <string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Assistance vocale"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Verrouiller"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Démarrage d\'Android en cours"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage en cours…"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossible de se connecter au Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" dispose d\'une mauvaise connexion Internet."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion ?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"L\'application %1$s souhaite se connecter au réseau Wi-Fi %2$s."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Une application"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Lancer le Wi-Fi Direct. Cela désactive le fonctionnement du Wi-Fi client ou via un point d\'accès."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La requête SS a été remplacée par une requête DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La requête SS a été remplacée par une requête USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La requête SS a été remplacée par une autre requête SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port du périphérique USB"</string>  </resources> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index b6122b4f45a1..26629c13c2a1 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo avión está activado"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo avión está desactivado"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> diff --git a/core/res/res/values-hi-rIN/donottranslate-cldr.xml b/core/res/res/values-hi-rIN/donottranslate-cldr.xml index 8f3075073018..b1dc879fb60f 100755 --- a/core/res/res/values-hi-rIN/donottranslate-cldr.xml +++ b/core/res/res/values-hi-rIN/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d-%m-%Y</string> diff --git a/core/res/res/values-hi/donottranslate-cldr.xml b/core/res/res/values-hi/donottranslate-cldr.xml index 8f3075073018..b1dc879fb60f 100755 --- a/core/res/res/values-hi/donottranslate-cldr.xml +++ b/core/res/res/values-hi/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %d-%m-%Y</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 64f0ab8aae73..2ebee8fcb359 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाई जहाज मोड चालू है"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाई जहाज मोड बंद है"</string>      <string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"वॉइस सहायक"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"अभी लॉक करें"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> diff --git a/core/res/res/values-hr-rHR/donottranslate-cldr.xml b/core/res/res/values-hr-rHR/donottranslate-cldr.xml index 2eb6d874cb26..ca21a47ecc46 100755 --- a/core/res/res/values-hr-rHR/donottranslate-cldr.xml +++ b/core/res/res/values-hr-rHR/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%-e. %B %Y.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e.%b.%Y.</string> diff --git a/core/res/res/values-hr/donottranslate-cldr.xml b/core/res/res/values-hr/donottranslate-cldr.xml index 2eb6d874cb26..ca21a47ecc46 100755 --- a/core/res/res/values-hr/donottranslate-cldr.xml +++ b/core/res/res/values-hr/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%-e. %B %Y.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e.%b.%Y.</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index d6c9660e30de..af4a6876d99a 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uključen je način rada u zrakoplovu"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Isključen je način rada u zrakoplovu"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Zaključaj sada"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Pokretanje Androida..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje pohrane."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiziranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Pripremanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Završetak inicijalizacije."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ne može se spojiti na Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima lošu internetsku vezu."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Dopustiti povezivanje?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikacija %1$s traži povezivanje s Wi-Fi mrežom %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacija"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Izravni Wi-Fi"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Pokreni izravan rad s Wi-Fi mrežom. To će isključiti rad s Wi-Fi klijentom/žarišnom točkom."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS zahtjev izmijenjen je u DIAL zahtjev."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev izmijenjen je u USSD zahtjev."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev izmijenjen je u novi SS zahtjev."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB priključak za periferne uređaje"</string>  </resources> diff --git a/core/res/res/values-hu-rHU/donottranslate-cldr.xml b/core/res/res/values-hu-rHU/donottranslate-cldr.xml index 81e3b12ef6fa..fd2fe920651c 100755 --- a/core/res/res/values-hu-rHU/donottranslate-cldr.xml +++ b/core/res/res/values-hu-rHU/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%Y. %B %-e.</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%Y.%m.%d., %-k:%M:%S</string> diff --git a/core/res/res/values-hu/donottranslate-cldr.xml b/core/res/res/values-hu/donottranslate-cldr.xml index bafa25e00372..3f60be7c1287 100755 --- a/core/res/res/values-hu/donottranslate-cldr.xml +++ b/core/res/res/values-hu/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%Y. %B %-e.</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S %Y.%m.%d.</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index ec5e47e06142..2a993cd8fab2 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Repülőgép üzemmód bekapcsolva"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Repülőgép üzemmód kikapcsolva"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Hangsegéd"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Zárolás most"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 5e2c5a9bdade..c48571e4cf54 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ինքնաթիռային ռեժիմը միացված է"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ինքնաթիռային ռեժիմը անջատված է"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Կարգավորումներ"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Ձայնային օգնութ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Կողպել հիմա"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Անվտանգ ռեժիմ"</string> diff --git a/core/res/res/values-in-rID/donottranslate-cldr.xml b/core/res/res/values-in-rID/donottranslate-cldr.xml index 1f8e542bc0e5..823b41fc579b 100755 --- a/core/res/res/values-in-rID/donottranslate-cldr.xml +++ b/core/res/res/values-in-rID/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e %b %Y</string>      <string name="date_time">%2$s %1$s</string> diff --git a/core/res/res/values-in/donottranslate-cldr.xml b/core/res/res/values-in/donottranslate-cldr.xml index b57823ad2ad4..35a84eb48433 100755 --- a/core/res/res/values-in/donottranslate-cldr.xml +++ b/core/res/res/values-in/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e %b %Y</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 70bcb1b9cec6..3eba04992bea 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode pesawat AKTIF"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode pesawat MATI"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Bantuan"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Kunci sekarang"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 1d7aaba6cc3e..690d6e54970b 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"KVEIKT er á flugstillingu"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"SLÖKKT er á flugstillingu"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Stillingar"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Raddaðstoð"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Læsa núna"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Örugg stilling"</string> @@ -904,7 +905,7 @@      <string name="eventTypeAnniversary" msgid="3876779744518284000">"Brúðkaupsafmæli"</string>      <string name="eventTypeOther" msgid="7388178939010143077">"Annað"</string>      <string name="emailTypeCustom" msgid="8525960257804213846">"Sérsniðið"</string> -    <string name="emailTypeHome" msgid="449227236140433919">"Heim"</string> +    <string name="emailTypeHome" msgid="449227236140433919">"Heima"</string>      <string name="emailTypeWork" msgid="3548058059601149973">"Vinna"</string>      <string name="emailTypeOther" msgid="2923008695272639549">"Annað"</string>      <string name="emailTypeMobile" msgid="119919005321166205">"Farsími"</string> diff --git a/core/res/res/values-it/donottranslate-cldr.xml b/core/res/res/values-it/donottranslate-cldr.xml index 2aea9510a0bf..95ba6dcd87c4 100755 --- a/core/res/res/values-it/donottranslate-cldr.xml +++ b/core/res/res/values-it/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %d/%b/%Y</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6443c1ac1da7..bea0c13694f0 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Blocca ora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Avvio di Android…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ottimizzazione archiviazione."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Ottimizzazione applicazione <xliff:g id="NUMBER_0">%1$d</xliff:g> di <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> in preparazione."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Avvio applicazioni."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Conclusione dell\'avvio."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossibile connettersi alla rete Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ha una connessione Internet debole."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Consentire la connessione?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"L\'applicazione %1$s vorrebbe connettersi alla rete Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Un\'applicazione"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Avvia Wi-Fi Direct. Verrà disattivato il client/hotspot Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La richiesta SS è stata modificata in richiesta DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La richiesta SS è stata modificata in richiesta USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La richiesta SS è stata modificata in nuova richiesta SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Porta periferica USB"</string>  </resources> diff --git a/core/res/res/values-iw/donottranslate-cldr.xml b/core/res/res/values-iw/donottranslate-cldr.xml index cf05c9da2c05..a9015d0a1a9f 100755 --- a/core/res/res/values-iw/donottranslate-cldr.xml +++ b/core/res/res/values-iw/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e ב%B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e.%-m.%Y</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 3c5390a47273..edf5dd88f342 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"מצב טיסה מופעל"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string>      <string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"נעל עכשיו"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"הפעלת Android מתחילה…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"מתבצעת אופטימיזציה של האחסון."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"מבצע אופטימיזציה של אפליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"מכין את <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"מפעיל אפליקציות."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"מסיים אתחול."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"אין אפשרות להתחבר ל-Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" אינו מחובר היטב לאינטרנט."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"האם להתיר את החיבור?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"האפליקציה %1$s מנסה להתחבר אל רשת ה-Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"אפליקציה"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi ישיר"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"הפעל Wi-Fi ישיר. פעולה זו תכבה את הנקודה לשיתוף אינטרנט ב-Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"בקשת SS שונתה לבקשת DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"בקשת SS שונתה לבקשת USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"בקשת SS שונתה לבקשת SS חדשה."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"יציאת USB בציוד היקפי"</string>  </resources> diff --git a/core/res/res/values-ja/donottranslate-cldr.xml b/core/res/res/values-ja/donottranslate-cldr.xml index 21aa0e61ef75..a3c1f647c9bd 100755 --- a/core/res/res/values-ja/donottranslate-cldr.xml +++ b/core/res/res/values-ja/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%Y年%-m月%-e日</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%Y/%m/%d %-k:%M:%S</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 3109a9be5152..8714dbbe7039 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"機内モードON"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"機内モードOFF"</string>      <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"今すぐロック"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"セーフモード"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Androidの起動中…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ストレージを最適化しています。"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>個中<xliff:g id="NUMBER_0">%1$d</xliff:g>個のアプリを最適化しています。"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>をペア設定しています。"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"アプリを起動しています。"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"ブートを終了しています。"</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>を実行中"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fiに接続できませんでした"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" はインターネット接続に問題があります。"</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"接続を許可しますか?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"アプリ%1$sがWi-Fiネットワーク%2$sへの接続を希望しています"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"アプリ"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Directを開始します。これによりWi-Fiクライアント/アクセスポイントがOFFになります。"</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SSリクエストはDIALリクエストに変更されました。"</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SSリクエストはUSSDリクエストに変更されました。"</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SSリクエストは新しいSSリクエストに変更されました。"</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB周辺機器ポート"</string>  </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 3c84acb9c624..421c3e266ab8 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"თვითმფრინავის რეჟიმი ჩართულია."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"თვითმფრინავის რეჟიმი გამორთულია."</string>      <string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ახლა ჩაკეტვა"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index f8df80cc840f..7fad880d37e4 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ұшақ режимі ҚОСУЛЫ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ұшақ режимі ӨШІРУЛІ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Қазір бекіту"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Қауіпсіз режим"</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 2e973dc61295..6f38aec38aec 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បានបើករបៀបពេលជិះយន្តហោះ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបពេលជិះយន្តហោះ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ការកំណត់"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ជំនួយសម្លេង"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ចាក់សោឥឡូវនេះ"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index befcfd21ebbb..421c10372a2a 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ಎರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ಎರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ಈಗ ಲಾಕ್ ಮಾಡಿ"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"ಸುರಕ್ಷಿತ ಮೋಡ್"</string> diff --git a/core/res/res/values-ko/donottranslate-cldr.xml b/core/res/res/values-ko/donottranslate-cldr.xml index 083b176a3b3e..626a480e40a2 100755 --- a/core/res/res/values-ko/donottranslate-cldr.xml +++ b/core/res/res/values-ko/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s. %s. %s."</string>      <string name="month_day_year">%Y년 %-m월 %-e일</string>      <string name="time_of_day">%p %-l:%M:%S</string>      <string name="date_and_time">%Y년 %-m월 %-e일 %p %-l:%M:%S</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 7594e18e7b6c..94c60d9f0a83 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행기 모드 사용중"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행기 모드 사용중이 아님"</string>      <string name="global_action_settings" msgid="1756531602592545966">"설정"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"지금 잠그기"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"안전 모드"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android가 시작되는 중…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"저장소 최적화 중"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"앱 <xliff:g id="NUMBER_1">%2$d</xliff:g>개 중 <xliff:g id="NUMBER_0">%1$d</xliff:g>개 최적화 중"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> 준비 중..."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"앱을 시작하는 중입니다."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"부팅 완료"</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi에 연결할 수 없습니다"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 인터넷 연결 상태가 좋지 않습니다."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"연결을 허용하시겠습니까?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s 애플리케이션에서 %2$s Wi-Fi 네트워크에 연결하려고 합니다."</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"앱"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct 작업을 시작합니다. 이 작업을 하면 Wi-Fi 클라이언트/핫스팟 작업이 중지됩니다."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 요청이 DIAL 요청으로 수정됩니다."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 요청이 USSD 요청으로 수정됩니다."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 요청이 새로운 SS 요청으로 수정됩니다."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 주변기기 포트"</string>  </resources> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 9675fdc5738b..898b226b9f85 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -305,6 +305,7 @@      <!-- no translation found for global_actions_airplane_mode_off_status (5075070442854490296) -->      <skip />      <string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Азыр кулпулоо"</string>      <!-- no translation found for status_bar_notification_info_overflow (5301981741705354993) -->      <skip /> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 21644ecab749..086a9e51c47a 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ເປີດໂໝດຢູ່ໃນຍົນແລ້ວ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ປິດໂໝດໃນຍົນແລ້ວ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ການຕັ້ງຄ່າ"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ຊ່ວຍເຫຼືອທາງສຽງ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ລັອກດຽວນີ້"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> diff --git a/core/res/res/values-lt-rLT/donottranslate-cldr.xml b/core/res/res/values-lt-rLT/donottranslate-cldr.xml index 8a50344a58e7..ba4a326d9b46 100755 --- a/core/res/res/values-lt-rLT/donottranslate-cldr.xml +++ b/core/res/res/values-lt-rLT/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%Y m. %B %-e d.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S, %Y-%m-%d</string> diff --git a/core/res/res/values-lt/donottranslate-cldr.xml b/core/res/res/values-lt/donottranslate-cldr.xml index b2368dc3a360..cdca7b6e2eb3 100755 --- a/core/res/res/values-lt/donottranslate-cldr.xml +++ b/core/res/res/values-lt/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%Y m. %B %-e d.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %Y.%m.%d</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 9e5bcb565533..d7a93aca1f1a 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ĮJUNGTAS lėktuvo režimas"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"lėktuvo režimas IŠJUNGTAS"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Užrakinti dabar"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Paleidžiama „Android“…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizuojama saugykla."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizuojama <xliff:g id="NUMBER_0">%1$d</xliff:g> progr. iš <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Ruošiama „<xliff:g id="APPNAME">%1$s</xliff:g>“."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Paleidžiamos programos."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Užbaigiamas paleidimas."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepavyko prisijungti prie „Wi-Fi“"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" turi prastą interneto ryšį."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Leisti prisijungti?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Programa „%1$s“ nori prisijungti prie „Wi-Fi“ tinklo „%2$s“"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Programa"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Tiesioginis „Wi-Fi“ ryšys"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Paleiskite „Wi-Fi Direct“. Bus išjungta „Wi-Fi“ programa / viešosios interneto prieigos taškas."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS užklausa pakeista į DIAL užklausą."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS užklausa pakeista į USSD užklausą."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS užklausa pakeista į naują SS užklausą."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB išorinis prievadas"</string>  </resources> diff --git a/core/res/res/values-lv-rLV/donottranslate-cldr.xml b/core/res/res/values-lv-rLV/donottranslate-cldr.xml index f5651572c9cf..3bed6cdb27c3 100755 --- a/core/res/res/values-lv-rLV/donottranslate-cldr.xml +++ b/core/res/res/values-lv-rLV/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%Y. gada %-e. %B</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%Y. gada %-e. %b, %H:%M:%S</string> diff --git a/core/res/res/values-lv/donottranslate-cldr.xml b/core/res/res/values-lv/donottranslate-cldr.xml index c21481abef3a..7ecdc318f841 100755 --- a/core/res/res/values-lv/donottranslate-cldr.xml +++ b/core/res/res/values-lv/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%Y. gada %-e. %B</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %Y. gada %-e. %b</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 20bad77d733a..1989b558bf53 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lidojuma režīms ir IESLĒGTS."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lidojuma režīms ir IZSLĒGTS."</string>      <string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloķēt tūlīt"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string>      <string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Notiek Android palaišana…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Notiek krātuves optimizēšana."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Tiek optimizēta <xliff:g id="NUMBER_0">%1$d</xliff:g>. lietotne no <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Notiek lietotnes <xliff:g id="APPNAME">%1$s</xliff:g> sagatavošana."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Notiek lietotņu palaišana."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Tiek pabeigta sāknēšana."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nevarēja izveidot savienojumu ar Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ir slikts interneta savienojums."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vai atļaut savienojumu?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Lietotne %1$s vēlas izveidot savienojumu ar Wi-Fi tīklu %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Lietojumprogramma"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Palaist programmu Wi-Fi Direct. Tādējādi tiks izslēgta Wi-Fi klienta/tīklāja darbība."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS pieprasījums ir mainīts uz DIAL pieprasījumu."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS pieprasījums ir mainīts uz USSD pieprasījumu."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS pieprasījums ir mainīts uz jaunu SS pieprasījumu."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB perifērijas ports"</string>  </resources> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 72dd8e231b7d..a3d038626450 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режимот на работа во авион е вклучен"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режимот на работа во авион е исклучен"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Заклучи сега"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Безбеден режим"</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 134a9b5dd763..49f86e85cd8b 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ഫ്ലൈറ്റ് മോഡ് ഓണാണ്"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ഫ്ലൈറ്റ് മോഡ് ഓഫാണ്"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണങ്ങൾ"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്സ് സഹായം"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ഇപ്പോൾ ലോക്കുചെയ്യുക"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"സുരക്ഷിത മോഡ്"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index da08b729d955..e71457090d91 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Дуут туслах"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Одоо түгжих"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index a2c21bd2e20f..763c18eb294b 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"विमान मोड चालू आहे"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"विमान मोड बंद आहे"</string>      <string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"आता लॉक करा"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 3ca56d748be0..21be5b193dfb 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mod Pesawat DIHIDUPKAN"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mod Pesawat DIMATIKAN"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Kunci sekarang"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index c8fb23cddb09..a8e95b5878fe 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ပိတ်ထားသည်"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"အသံ အကူအညီ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ယခု သော့ပိတ်ရန်"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"၉၉၉+"</string>      <string name="safeMode" msgid="2788228061547930246">"အန္တရာယ်ကင်းမှု စနစ်(Safe mode)"</string> diff --git a/core/res/res/values-nb/donottranslate-cldr.xml b/core/res/res/values-nb/donottranslate-cldr.xml index 3b2a6c671d60..17aea0ec48b3 100755 --- a/core/res/res/values-nb/donottranslate-cldr.xml +++ b/core/res/res/values-nb/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e. %b %Y</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 856e2d3b2685..35147e40564b 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flymodus er på"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flymodus er av"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nå"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 73aa852c8930..093f3c987c07 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खुला छ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बन्द छ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"सेटिङ्हरू"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"अब बन्द गर्नुहोस्"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>      <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> @@ -1353,7 +1354,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाइ-फाइसँग जडान गर्न सकेन"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" कमजोर इन्टरनेट जडान छ।"</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"जडान अनुमति दिने हो?"</string> -    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"अनुप्रयोग %1$s वाइफाइ नेटवर्क %2$s मा जडान गर्न चाहन्छ"</string> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"अनुप्रयोग %1$s Wifi सञ्जाल %2$s मा जडान गर्न चाहन्छ"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"एउटा अनुप्रयोग"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाइफाइ प्रत्यक्ष"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाइफाइ सिधा सुरु गर्नुहोस्। यसले वाइफाइ ग्राहक/हट्स्पटलाई बन्द गराउने छ।"</string> diff --git a/core/res/res/values-nl/donottranslate-cldr.xml b/core/res/res/values-nl/donottranslate-cldr.xml index 29b120c329ec..35a84eb48433 100755 --- a/core/res/res/values-nl/donottranslate-cldr.xml +++ b/core/res/res/values-nl/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e %b %Y</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index fc496aa60a3f..0aff86041ef4 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegmodus is AAN"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegmodus is UIT"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Nu vergrendelen"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>      <string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string> diff --git a/core/res/res/values-pl/donottranslate-cldr.xml b/core/res/res/values-pl/donottranslate-cldr.xml index f9431b23f040..3f341b801485 100755 --- a/core/res/res/values-pl/donottranslate-cldr.xml +++ b/core/res/res/values-pl/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d.%m.%Y %H:%M:%S</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 06cca3baa4cf..2b2591836b4b 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Tryb samolotowy jest włączony"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Tryb samolotowy jest wyłączony"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Asystent głosowy"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Zablokuj teraz"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android się uruchamia…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optymalizacja pamięci."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optymalizowanie aplikacji <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Przygotowuję aplikację <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uruchamianie aplikacji."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Kończenie uruchamiania."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Działa <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nie można połączyć się z siecią Wi-Fi."</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ma powolne połączenie internetowe."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Zezwolić na połączenie?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikacja %1$s chce połączyć się z siecią Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacja"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Uruchom Wi-Fi Direct. Spowoduje to wyłączenie klienta lub punktu dostępu Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Żądanie SS zostało zmienione na żądanie DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Żądanie SS zostało zmienione na żądanie USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Żądanie SS zostało zmienione na nowe żądanie SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port peryferyjny USB"</string>  </resources> diff --git a/core/res/res/values-pt-rPT/donottranslate-cldr.xml b/core/res/res/values-pt-rPT/donottranslate-cldr.xml index 9c9f903755af..6355432c03f9 100755 --- a/core/res/res/values-pt-rPT/donottranslate-cldr.xml +++ b/core/res/res/values-pt-rPT/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e de %B de %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e de %b de %Y</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index b5e5484fcbe0..041847db0a80 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está ativado"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desativado"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Definições"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. de voz"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> diff --git a/core/res/res/values-pt/donottranslate-cldr.xml b/core/res/res/values-pt/donottranslate-cldr.xml index 2da7599c704b..c97b337b8897 100755 --- a/core/res/res/values-pt/donottranslate-cldr.xml +++ b/core/res/res/values-pt/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e de %B de %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %d/%m/%Y</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 5aab6e21dd1a..4ea2f18de670 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avião ATIVADO"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avião DESATIVADO"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Bloquear agora"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"O Android está iniciando..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Otimizando o armazenamento."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível se conectar a redes Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma conexão de baixa qualidade com a Internet."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir conexão?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"O app %1$s deseja se conectar à rede Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Um app"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Iniciar o Wi-Fi Direct. Isso desativará o ponto de acesso/cliente Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitação SS foi modificada para a solicitação DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Porta USB periférica"</string>  </resources> diff --git a/core/res/res/values-ro-rRO/donottranslate-cldr.xml b/core/res/res/values-ro-rRO/donottranslate-cldr.xml index cfb79e862f68..c874dcf26a76 100755 --- a/core/res/res/values-ro-rRO/donottranslate-cldr.xml +++ b/core/res/res/values-ro-rRO/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S, %d.%m.%Y</string> diff --git a/core/res/res/values-ro/donottranslate-cldr.xml b/core/res/res/values-ro/donottranslate-cldr.xml index cfb79e862f68..c874dcf26a76 100755 --- a/core/res/res/values-ro/donottranslate-cldr.xml +++ b/core/res/res/values-ro/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S, %d.%m.%Y</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 4bd24970089a..031b9834cf89 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modul Avion este ACTIVAT"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modul avion este DEZACTIVAT"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Setări"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Blocați acum"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string>      <string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android pornește..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Se optimizează stocarea."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Se optimizează aplicaţia <xliff:g id="NUMBER_0">%1$d</xliff:g> din <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Se pregătește <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Se pornesc aplicaţiile."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Se finalizează pornirea."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nu se poate conecta la Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" are o conexiune la internet slabă."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permiteți conectarea?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplicația %1$s dorește să se conecteze la rețeaua Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"O aplicație"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Porniţi Wi-Fi Direct. Acest lucru va dezactiva clientul/hotspotul Wi-Fi."</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Solicitarea SS este modificată într-o solicitare DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Solicitarea SS este modificată într-o solicitare USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Solicitarea SS este modificată într-o nouă solicitare SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port USB periferic"</string>  </resources> diff --git a/core/res/res/values-ru/donottranslate-cldr.xml b/core/res/res/values-ru/donottranslate-cldr.xml index c22df9938e3e..a36f13dacea4 100755 --- a/core/res/res/values-ru/donottranslate-cldr.xml +++ b/core/res/res/values-ru/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y г.</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S, %d.%m.%Y</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 48e4a23245ff..608407d43182 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Выключить"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Включить"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Заблокировать"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>      <string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Запуск Android…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизация хранилища…"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизация приложения <xliff:g id="NUMBER_0">%1$d</xliff:g> из <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Подготовка приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\"..."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск приложений."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Окончание загрузки..."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Приложение <xliff:g id="APP">%1$s</xliff:g> запущено"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не удалось подключиться к сети Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" – плохое интернет-соединение."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Разрешить подключение?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Приложение \"%1$s\" запрашивает доступ на подключение к сети Wi-Fi (%2$s)"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Приложение"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Начать соединение через Wi-Fi Direct. Модуль Wi-Fi будет отключен."</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-запрос преобразован в DIAL-запрос."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-запрос преобразован в USSD-запрос."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-запрос преобразован в новый SS-запрос."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Внешний USB-порт"</string>  </resources> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 559e86534868..b7ccd996d571 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"අහස්යානා ආකාරය සක්රීයයි."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"අහස්යානා අකාරය අක්රියයි"</string>      <string name="global_action_settings" msgid="1756531602592545966">"සැකසීම්"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"හඬ සහායක"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"දැන් අගුළු දමන්න"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"ආරක්ෂිත ආකාරය"</string> @@ -1349,7 +1350,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi වෙත සම්බන්ධ විය නොහැක"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" දුබල අන්තර්ජාල සම්බන්ධතාවයක් ඇත."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"සම්බන්ධතාවයට ඉඩ දෙන්නද?"</string> -    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"යෙදුම් %1$s ක් WiFi ජාලය %2$s වෙත සබැඳීමට කැමතියි"</string> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"යෙදුම් %1$s ක් WiFi ජාලය %2$s වෙත සම්බන්ධ කිරීමට කැමතියි"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"යෙදුම"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"ඍජු Wi-Fi"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"ඍජු Wi-Fi ආරම්භ කරන්න. මෙය Wi-Fi සේවාදායක/හොට්ස්පොට් එක අක්රිය කරනු ඇත."</string> @@ -1880,6 +1881,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ඉල්ලීම DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ඉල්ලීම USSD ඉල්ලීම වෙත විකරණය කරන ලදී."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ඉල්ලීම නව DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string> -    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"ඇන්ඩ්රොයිඩ්"</string> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>      <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB පර්යන්ත තොට"</string>  </resources> diff --git a/core/res/res/values-sk-rSK/donottranslate-cldr.xml b/core/res/res/values-sk-rSK/donottranslate-cldr.xml index 765c51e05da3..51f7e38e1e6a 100755 --- a/core/res/res/values-sk-rSK/donottranslate-cldr.xml +++ b/core/res/res/values-sk-rSK/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s. %s. %s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S %-e. %-m. %Y</string> diff --git a/core/res/res/values-sk/donottranslate-cldr.xml b/core/res/res/values-sk/donottranslate-cldr.xml index d4953c38b2e0..b30fe97965f3 100755 --- a/core/res/res/values-sk/donottranslate-cldr.xml +++ b/core/res/res/values-sk/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e. %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index f275f855d440..2a737704c291 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim v lietadle je ZAPNUTÝ"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim v lietadle je VYPNUTÝ"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Nastavenia"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Hlasový asistent"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Uzamknúť"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string> @@ -703,7 +704,7 @@      <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Umožňuje aplikácii zobraziť informácie o sieťach Wi-Fi. Napríklad o tom, či je sieť Wi-Fi povolená alebo názvy pripojených zariadení Wi-Fi."</string>      <string name="permlab_changeWifiState" msgid="6550641188749128035">"pripojiť a odpojiť od siete Wi-Fi"</string>      <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Umožňuje aplikácii pripojiť sa na prístupové body siete Wi-Fi, odpojiť sa od nich a meniť konfiguráciu zariadení pre siete Wi-Fi."</string> -    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Povoliť príjem viacsmerového vysielania Wi-Fi"</string> +    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"povoliť príjem Wi-Fi Multicast"</string>      <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries, nielen pomocou vášho tabletu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string>      <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Umožňuje aplikácii prijímať pakety odosielané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries (a nie iba do vášho televízora). Spotrebúva viac energie ako režim bez viacsmerového vysielania."</string>      <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Umožňuje aplikácii prijímať pakety odoslané na všetky zariadenia v sieti Wi-Fi pomocou viacsmerových adries, nielen pomocou vášho telefónu. Spotrebuje viac energie ako režim bez viacsmerového vysielania."</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Systém Android sa spúšťa…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimalizuje sa úložisko"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Prebieha optimalizácia aplikácie <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Pripravuje sa aplikácia <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Prebieha spúšťanie aplikácií."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Prebieha dokončovanie spúšťania."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepodarilo sa pripojiť k sieti Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má nekvalitné internetové pripojenie."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povoliť pripojenie?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikácia %1$s sa chce pripojiť k sieti Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikácia"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Priame pripojenie Wi-Fi"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Spustiť priame pripojenie siete Wi-Fi. Táto možnosť vypne sieť Wi-Fi v režime klient alebo hotspot."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Žiadosť SS bola upravená na žiadosť DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Žiadosť SS bola upravená na žiadosť USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Žiadosť SS bola upravená na novú žiadosť SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Port USB pre periférne zariadenia"</string>  </resources> diff --git a/core/res/res/values-sl-rSI/donottranslate-cldr.xml b/core/res/res/values-sl-rSI/donottranslate-cldr.xml index 17d8609eca77..798f4c0f1863 100755 --- a/core/res/res/values-sl-rSI/donottranslate-cldr.xml +++ b/core/res/res/values-sl-rSI/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s. %s. %s"</string>      <string name="month_day_year">%d. %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S, %-e. %b %Y</string> diff --git a/core/res/res/values-sl/donottranslate-cldr.xml b/core/res/res/values-sl/donottranslate-cldr.xml index 83e4693a43da..92cd963bb18f 100755 --- a/core/res/res/values-sl/donottranslate-cldr.xml +++ b/core/res/res/values-sl/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s. %s. %s"</string>      <string name="month_day_year">%d. %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e. %b. %Y</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index a53aac83f39b..bc8a85178cbf 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Način za letalo je VKLOPLJEN"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način za letalo je IZKLOPLJEN"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Zakleni zdaj"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>      <string name="safeMode" msgid="2788228061547930246">"Varni način"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android se zaganja …"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje shrambe."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Pripravljanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon aplikacij."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončevanje zagona."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Z omrežjem Wi-Fi se ni mogoče povezati"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima slabo internetno povezavo."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ali dovolite vzpostavitev povezave?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Aplikacija %1$s želi vzpostaviti povezavo z omrežjem Wi-Fi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Aplikacija"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Zaženite Wi-Fi Direct. S tem boste izklopili odjemalca/dostopno točko Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Zahteva SS je spremenjena v zahtevo DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Zahteva SS je spremenjena v zahtevo USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Zahteva SS je spremenjena v novo zahtevo SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Zunanja vrata USB"</string>  </resources> diff --git a/core/res/res/values-sr-rRS/donottranslate-cldr.xml b/core/res/res/values-sr-rRS/donottranslate-cldr.xml index 8bb5fa7f1104..a0f4bc2497aa 100755 --- a/core/res/res/values-sr-rRS/donottranslate-cldr.xml +++ b/core/res/res/values-sr-rRS/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%d. %B %Y.</string>      <string name="time_of_day">%H.%M.%S</string>      <string name="date_and_time">%H.%M.%S %d.%m.%Y.</string> diff --git a/core/res/res/values-sr/donottranslate-cldr.xml b/core/res/res/values-sr/donottranslate-cldr.xml index 8bb5fa7f1104..a0f4bc2497aa 100755 --- a/core/res/res/values-sr/donottranslate-cldr.xml +++ b/core/res/res/values-sr/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s."</string>      <string name="month_day_year">%d. %B %Y.</string>      <string name="time_of_day">%H.%M.%S</string>      <string name="date_and_time">%H.%M.%S %d.%m.%Y.</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index b1510b6ab3bf..6d1e79322f88 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим рада у авиону је УКЉУЧЕН"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим рада у авиону је ИСКЉУЧЕН"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Подешавања"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помоћ"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Закључај одмах"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android се покреће…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Меморија се оптимизује."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизовање апликације <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Припрема се <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Покретање апликација."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Завршавање покретања."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Није могуће повезати са Wi-Fi мрежом"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лошу интернет везу."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Желите ли да дозволите повезивање?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Апликација %1$s жели да се повеже на Wi-Fi мрежу %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Апликација"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Покрените Wi-Fi Direct. Тиме ћете искључити клијента/хотспот за Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS захтев је промењен у DIAL захтев."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS захтев је промењен у USSD захтев."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS захтев је промењен у нови SS захтев."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB порт за периферијске уређаје"</string>  </resources> diff --git a/core/res/res/values-sv/donottranslate-cldr.xml b/core/res/res/values-sv/donottranslate-cldr.xml index 29b120c329ec..35a84eb48433 100755 --- a/core/res/res/values-sv/donottranslate-cldr.xml +++ b/core/res/res/values-sv/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e %b %Y</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 8fbf645ecc07..61b0a3d658d9 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flygplansläge är AKTIVERAT"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flygplansläge är INAKTIVERAT"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Lås nu"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string> diff --git a/core/res/res/values-sw/donottranslate-cldr.xml b/core/res/res/values-sw/donottranslate-cldr.xml index b6304e7b2943..7313c71b4fca 100755 --- a/core/res/res/values-sw/donottranslate-cldr.xml +++ b/core/res/res/values-sw/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%Y %B %-e</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %Y %b %-e</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b2b21e3bd42f..9a97e241d107 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndege IMEWASHWA"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndege IMEZIMWA"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Funga sasa"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Inaanzisha Android..."</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Inaboresha hifadhi."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Inaboresha programu <xliff:g id="NUMBER_0">%1$d</xliff:g> kutoka <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Inaandaa <xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Programu zinaanza"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Inamaliza kuwasha."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> inaendelea"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Haikuweza kuunganisha kwa Mtandao-Hewa"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ina muunganisho duni wa Mtandao."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ungepenga kuruhusu muunganisho?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Programu ya %1$s ingependa kuunganisha kwenye Mtandao wa Wifi wa %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Programu"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Mtandao hewa Moja kwa moja"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Anzisha Wi-Fi Moja kwa Moja. Hii itazima mteja/mtandao-hewa wa Wi-Fi."</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Ombi la SS limerekebishwa na kuwa ombi la DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ombi la SS limerekebishwa na kuwa ombi la USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ombi la SS limerekebishwa na kuwa ombi jipya la SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Mlango wa USB wa Pembeni"</string>  </resources> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index c8deaa7de8b0..03ffc988fab7 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"விமானப் பயன்முறை இயக்கத்தில் உள்ளது"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"விமானப் பயன்முறை முடக்கத்தில் உள்ளது"</string>      <string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"இப்போது பூட்டு"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"பாதுகாப்பு பயன்முறை"</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 27eeb8895c57..2c80adb08398 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ఎయిర్ప్లేన్ మోడ్ ఆన్లో ఉంది"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ఎయిర్ప్లేన్ మోడ్ ఆఫ్లో ఉంది"</string>      <string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్లు"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ సహాయకం"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ఇప్పుడు లాక్ చేయండి"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"సురక్షిత మోడ్"</string> diff --git a/core/res/res/values-th-rTH/donottranslate-cldr.xml b/core/res/res/values-th-rTH/donottranslate-cldr.xml index 2f389f7f6170..867a58e38263 100755 --- a/core/res/res/values-th-rTH/donottranslate-cldr.xml +++ b/core/res/res/values-th-rTH/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S, %-e %b %Y</string> diff --git a/core/res/res/values-th/donottranslate-cldr.xml b/core/res/res/values-th/donottranslate-cldr.xml index 2f389f7f6170..867a58e38263 100755 --- a/core/res/res/values-th/donottranslate-cldr.xml +++ b/core/res/res/values-th/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-k:%M:%S</string>      <string name="date_and_time">%-k:%M:%S, %-e %b %Y</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index a4ebcec6448c..bb972e44e2a9 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string>      <string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"ตัวช่วยเสียง"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ล็อกเลย"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string> diff --git a/core/res/res/values-tl/donottranslate-cldr.xml b/core/res/res/values-tl/donottranslate-cldr.xml index 4f69833ecfb0..7313c71b4fca 100755 --- a/core/res/res/values-tl/donottranslate-cldr.xml +++ b/core/res/res/values-tl/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%Y %B %-e</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %Y %b %-e</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 518d1f5d02d0..97dda674def0 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Naka-ON ang airplane mode"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Naka-OFF ang airplane mode"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Mga Setting"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"I-lock ngayon"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> diff --git a/core/res/res/values-tr/donottranslate-cldr.xml b/core/res/res/values-tr/donottranslate-cldr.xml index 8bdcf48bc480..0577faba5fef 100755 --- a/core/res/res/values-tr/donottranslate-cldr.xml +++ b/core/res/res/values-tr/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s %s %s"</string>      <string name="month_day_year">%d %B %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d %b %Y %H:%M:%S</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index e62423e546ad..ebc10da59299 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçak modu AÇIK"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Uçak modu KAPALI"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"Şimdi kilitle"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android başlatılıyor…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Depolama optimize ediliyor."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> uygulama optimize ediliyor."</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> hazırlanıyor."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uygulamalar başlatılıyor"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Açılış tamamlanıyor."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kablosuz bağlantısı kurulamadı"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" İnternet bağlantısı zayıf."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Bağlantıya izin verilsin mi?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"%1$s uygulaması %2$s Kablosuz Ağına bağlanmak istiyor"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Bir uygulama"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Kablosuz Doğrudan Bağlantı"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Kablosuz Doğrudan Bağlantı\'yı başlat. Bu işlem, Kablosuz istemci/hotspot kullanımını kapatacak."</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS isteği DIAL isteği olarak değiştirildi."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS isteği USSD isteği olarak değiştirildi."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS isteği yeni SS isteği olarak değiştirildi."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB Çevre Birimi Bağlantı Noktası"</string>  </resources> diff --git a/core/res/res/values-uk-rUA/donottranslate-cldr.xml b/core/res/res/values-uk-rUA/donottranslate-cldr.xml index c137df904950..75025d888dc2 100755 --- a/core/res/res/values-uk-rUA/donottranslate-cldr.xml +++ b/core/res/res/values-uk-rUA/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y р.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%-e %b %Y р., %H:%M:%S</string> diff --git a/core/res/res/values-uk/donottranslate-cldr.xml b/core/res/res/values-uk/donottranslate-cldr.xml index b8c0d1e3ed85..1c25b4d51872 100755 --- a/core/res/res/values-uk/donottranslate-cldr.xml +++ b/core/res/res/values-uk/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s.%s.%s"</string>      <string name="month_day_year">%-e %B %Y р.</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%H:%M:%S %-e %b %Y</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 47c364baa20f..664976a69d86 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим польоту ВВІМК."</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим польоту ВИМК."</string>      <string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Голос. підказки"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Блокувати зараз"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index ae7acf2a2c57..edab739f7d04 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ہوائی جہاز وضع آن ہے"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ہوائی جہاز وضع آف ہے"</string>      <string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"صوتی مدد"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"ابھی مقفل کریں"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"حفاظتی وضع"</string> @@ -1879,5 +1880,5 @@      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS درخواست میں ترمیم کر کے USSD درخواست بنا دی گئی ہے۔"</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS درخواست میں ترمیم کر کے نئی SS درخواست بنا دی گئی ہے۔"</string>      <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> -    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB ملحقہ پورٹ"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB پیرفرل پورٹ"</string>  </resources> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 51d24ed8fd34..30164e1c18ee 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Parvoz usuli yoqilgan"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Parvoz rejimi o‘chirilgan"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Sozlamalar"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Ovozli yordam"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Qulflash"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Xavfsiz usul"</string> diff --git a/core/res/res/values-vi-rVN/donottranslate-cldr.xml b/core/res/res/values-vi-rVN/donottranslate-cldr.xml index 3a735bfd0e28..8f5cf3bf6a06 100755 --- a/core/res/res/values-vi-rVN/donottranslate-cldr.xml +++ b/core/res/res/values-vi-rVN/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">Ngày %d tháng %-m năm %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d-%m-%Y %H:%M:%S</string> diff --git a/core/res/res/values-vi/donottranslate-cldr.xml b/core/res/res/values-vi/donottranslate-cldr.xml index 3a735bfd0e28..8f5cf3bf6a06 100755 --- a/core/res/res/values-vi/donottranslate-cldr.xml +++ b/core/res/res/values-vi/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">Ngày %d tháng %-m năm %Y</string>      <string name="time_of_day">%H:%M:%S</string>      <string name="date_and_time">%d-%m-%Y %H:%M:%S</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index a6172d74e097..2bf3819df2e5 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Chế độ trên máy bay BẬT"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Chế độ trên máy bay TẮT"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Khóa ngay"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string> diff --git a/core/res/res/values-zh-rCN/donottranslate-cldr.xml b/core/res/res/values-zh-rCN/donottranslate-cldr.xml index b83f412b9649..b3f009ef0780 100755 --- a/core/res/res/values-zh-rCN/donottranslate-cldr.xml +++ b/core/res/res/values-zh-rCN/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%Y 年 %-m 月 %-e 日</string>      <string name="time_of_day">%p %I:%M:%S</string>      <string name="date_and_time">%Y 年 %-m 月 %-e 日%p %I:%M:%S</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index d225e3f5ec1d..f1a4fb318f68 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -200,6 +200,8 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"已开启飞行模式"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"未开启飞行模式"</string>      <string name="global_action_settings" msgid="1756531602592545966">"设置"</string> +    <!-- no translation found for global_action_voice_assist (7751191495200504480) --> +    <skip />      <string name="global_action_lockdown" msgid="8751542514724332873">"立即锁定"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> @@ -1301,8 +1303,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android 正在启动…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在优化存储空间。"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"正在优化第<xliff:g id="NUMBER_0">%1$d</xliff:g>个应用(共<xliff:g id="NUMBER_1">%2$d</xliff:g>个)。"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"正在准备升级<xliff:g id="APPNAME">%1$s</xliff:g>。"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在启动应用。"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"即将完成启动。"</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>正在运行"</string> @@ -1348,8 +1349,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"无法连接到WLAN"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互联网连接状况不佳。"</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"要允许连接吗?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"“%1$s”应用想要连接到 WLAN 网络“%2$s”"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"一款应用"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"WLAN直连"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"启动WLAN直连。此操作将会关闭WLAN客户端/热点。"</string> @@ -1880,8 +1880,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 请求已修改为 DIAL 请求。"</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 请求已修改为 USSD 请求。"</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 请求已修改为新的 SS 请求。"</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 外设端口"</string>  </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 210e955303e3..83ae8f33f1ce 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛行模式為 [關閉]"</string>      <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"立即鎖定"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> @@ -1301,7 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在優化儲存空間。"</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"正在優化第 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="NUMBER_1">%2$d</xliff:g> 個)。"</string> -    <string name="android_preparing_apk" msgid="8162599310274079154">"正在準備升級「<xliff:g id="APPNAME">%1$s</xliff:g>」。"</string> +    <string name="android_preparing_apk" msgid="8162599310274079154">"正在準備 <xliff:g id="APPNAME">%1$s</xliff:g>。"</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"正在執行 <xliff:g id="APP">%1$s</xliff:g>"</string> @@ -1347,7 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"無法連線至 Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互聯網連線欠佳。"</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"允許連線?"</string> -    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"「%1$s」應用程式要求連線至 WiFi 網路 %2$s"</string> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"應用程式 %1$s 要求連線至 WiFi 網絡 %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"應用程式"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"啟動 Wi-Fi Direct,這會關閉 Wi-Fi 使用者端/熱點。"</string> @@ -1879,5 +1880,5 @@      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已修改為 USSD 要求。"</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已修改為新的 SS 要求。"</string>      <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string> -    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 週邊連接埠"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"USB 外端連接埠"</string>  </resources> diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml index 0a198969fc34..3e2b33dc87ee 100755 --- a/core/res/res/values-zh-rTW/donottranslate-cldr.xml +++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%Y 年 %-m 月 %-e 日</string>      <string name="time_of_day">%p %I:%M:%S</string>      <string name="date_and_time">%Y/%-m/%-e %p %I:%M:%S</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 97d878a7ef57..c9e5364a71bd 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛航模式為 [關閉]"</string>      <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"立即鎖定"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string>      <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> diff --git a/core/res/res/values-zu/donottranslate-cldr.xml b/core/res/res/values-zu/donottranslate-cldr.xml index 087ad83304db..e2cf516a42da 100755 --- a/core/res/res/values-zu/donottranslate-cldr.xml +++ b/core/res/res/values-zu/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s-%s-%s"</string>      <string name="month_day_year">%-e %B %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%-l:%M:%S %p %-e %b %Y</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index f9eb8301fe39..77cfddebe24f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -200,6 +200,7 @@      <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Imodi yendiza IVULIWE"</string>      <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Imodi yendiza IVALIWE"</string>      <string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string> +    <string name="global_action_voice_assist" msgid="7751191495200504480">"Isisekeli sezwi"</string>      <string name="global_action_lockdown" msgid="8751542514724332873">"Khiya manje"</string>      <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>      <string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string> @@ -1301,8 +1302,7 @@      <string name="android_start_title" msgid="8418054686415318207">"I-Android iyaqala…"</string>      <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ikhulisa isitoreji."</string>      <string name="android_upgrading_apk" msgid="7904042682111526169">"Ukubeka ezingeni eliphezulu <xliff:g id="NUMBER_0">%1$d</xliff:g> uhlelo lokusebenza <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string> -    <!-- no translation found for android_preparing_apk (8162599310274079154) --> -    <skip /> +    <string name="android_preparing_apk" msgid="8162599310274079154">"Ukulungisela i-<xliff:g id="APPNAME">%1$s</xliff:g>."</string>      <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Qalisa izinhlelo zokusebenza."</string>      <string name="android_upgrading_complete" msgid="1405954754112999229">"Qedela ukuqala kabusha."</string>      <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> iyasebenza"</string> @@ -1348,8 +1348,7 @@      <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ayikwazanga ukuxhuma kwi-Wi-Fi"</string>      <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" inoxhumano oluphansi lwe-inthanethi."</string>      <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vumela ukuxhumeka?"</string> -    <!-- no translation found for wifi_connect_alert_message (6451273376815958922) --> -    <skip /> +    <string name="wifi_connect_alert_message" msgid="6451273376815958922">"Uhlelo lokusebenza %1$s lungathanda ukuxhuma kunethiwekhi ye-Wifi %2$s"</string>      <string name="wifi_connect_default_application" msgid="7143109390475484319">"Uhlelo lokusebenza"</string>      <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"I-Wi-Fi Eqondile"</string>      <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Qala ukusebenza kwe-Wi-Fi Okuqondile. Lokhu kuzocima ikhasimende le-Wi-Fi/Ukusebenza okwe-hotspot"</string> @@ -1880,8 +1879,6 @@      <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Isicelo se-SS siguqulelwe kusicelo se-DIAL."</string>      <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Isicelo se-SS siguqulelwe kusicelo se-USSD."</string>      <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Isicelo se-SS siguqulelwe kusicelo esisha se-SS."</string> -    <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) --> -    <skip /> -    <!-- no translation found for usb_midi_peripheral_model_name (1959288763942653301) --> -    <skip /> +    <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"I-Android"</string> +    <string name="usb_midi_peripheral_model_name" msgid="1959288763942653301">"Imbobo ye-USB Peripheral"</string>  </resources> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index f6a5787a9697..3312f4f5c75d 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -302,7 +302,6 @@         <item>@drawable/ab_solid_shadow_material</item>         <item>@drawable/activated_background_material</item>         <item>@drawable/btn_borderless_material</item> -       <item>@drawable/btn_cab_done_material</item>         <item>@drawable/btn_check_material_anim</item>         <item>@drawable/btn_default_material</item>         <item>@drawable/btn_radio_material_anim</item> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 84609cadaf14..967832246e0b 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1023,7 +1023,11 @@           <p>NOTE: A task's root activity value is applied to all additional activities launched in           the task. That is if the root activity of a task is resizeable then the system will treat           all other activities in the task as resizeable and will not if the root activity isn't -         resizeable. --> +         resizeable. + +         <p>NOTE: The value of {@link android.R.attr#screenOrientation} will be ignored for +         resizeable activities as the system doesn't support fixed orientation on a resizeable +         activity. -->      <attr name="resizeableActivity" format="boolean" />      <!-- The <code>manifest</code> tag is the root of an diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml index e1e1ffeda5f7..197587523c3b 100644 --- a/core/res/res/values/dimens_material.xml +++ b/core/res/res/values/dimens_material.xml @@ -114,4 +114,6 @@      <!-- Padding above and below selection dialog lists. -->      <dimen name="dialog_list_padding_vertical_material">8dp</dimen> + +    <dimen name="progress_bar_height_material">4dp</dimen>  </resources> diff --git a/core/res/res/values/donottranslate-cldr.xml b/core/res/res/values/donottranslate-cldr.xml index 80db6e434542..a8e2b2bc3246 100755 --- a/core/res/res/values/donottranslate-cldr.xml +++ b/core/res/res/values/donottranslate-cldr.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="UTF-8"?>  <resources xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -    <string name="numeric_date_template">"%s/%s/%s"</string>      <string name="month_day_year">%B %-e, %Y</string>      <string name="time_of_day">%-l:%M:%S %p</string>      <string name="date_and_time">%b %-e, %Y, %-l:%M:%S %p</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fdaec800f478..813de7cbf977 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -708,7 +708,6 @@    <java-symbol type="string" name="noon" />    <java-symbol type="string" name="number_picker_increment_scroll_action" />    <java-symbol type="string" name="number_picker_increment_scroll_mode" /> -  <java-symbol type="string" name="numeric_date_template" />    <java-symbol type="string" name="old_app_action" />    <java-symbol type="string" name="old_app_description" />    <java-symbol type="string" name="older" /> diff --git a/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java new file mode 100644 index 000000000000..f9b69a080a4f --- /dev/null +++ b/core/tests/coretests/src/android/content/pm/RegisteredServicesCacheTest.java @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.content.pm; + +import android.content.Context; +import android.content.res.Resources; +import android.os.FileUtils; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.UserHandle; +import android.test.AndroidTestCase; +import android.util.AttributeSet; +import android.util.SparseArray; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Tests for {@link android.content.pm.RegisteredServicesCache} + */ +public class RegisteredServicesCacheTest extends AndroidTestCase { + +    private final ResolveInfo r1 = new ResolveInfo(); +    private final ResolveInfo r2 = new ResolveInfo(); +    private final TestServiceType t1 = new TestServiceType("t1", "value1"); +    private final TestServiceType t2 = new TestServiceType("t2", "value2"); +    private File mDataDir; +    private File mSyncDir; + +    @Override +    protected void setUp() throws Exception { +        super.setUp(); +        File cacheDir = mContext.getCacheDir(); +        mDataDir = new File(cacheDir, "testServicesCache"); +        FileUtils.deleteContents(mDataDir); +        mSyncDir = new File(mDataDir, "system/registered_services"); +        mSyncDir.mkdirs(); +    } + +    public void testGetAllServicesHappyPath() { +        TestServicesCache cache = new TestServicesCache(mContext, mDataDir); +        cache.addServiceForQuerying(0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, 1)); +        cache.addServiceForQuerying(0, r2, new RegisteredServicesCache.ServiceInfo<>(t2, null, 2)); +        assertEquals(2, cache.getAllServicesSize(0)); +        assertEquals(2, cache.getPersistentServicesSize(0)); +        File file = new File(mSyncDir, TestServicesCache.SERVICE_INTERFACE + ".xml"); +        assertTrue("File should be created at " + file, file.length() > 0); +        // Make sure all services can be loaded from xml +        cache = new TestServicesCache(mContext, mDataDir); +        assertEquals(2, cache.getPersistentServicesSize(0)); +    } + +    public void testGetAllServicesReplaceUid() { +        TestServicesCache cache = new TestServicesCache(mContext, mDataDir); +        cache.addServiceForQuerying(0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, 1)); +        cache.addServiceForQuerying(0, r2, new RegisteredServicesCache.ServiceInfo<>(t2, null, 2)); +        cache.getAllServices(0); +        // Invalidate cache and clear update query results +        cache.invalidateCache(0); +        cache.clearServicesForQuerying(); +        cache.addServiceForQuerying(0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, 1)); +        cache.addServiceForQuerying(0, r2, new RegisteredServicesCache.ServiceInfo<>(t2, null, +                TestServicesCache.SYSTEM_IMAGE_UID)); +        Collection<RegisteredServicesCache.ServiceInfo<TestServiceType>> allServices = cache +                .getAllServices(0); +        assertEquals(2, allServices.size()); +        Set<Integer> uids = new HashSet<>(); +        for (RegisteredServicesCache.ServiceInfo<TestServiceType> srv : allServices) { +            uids.add(srv.uid); +        } +        assertTrue("UID must be updated to the new value", +                uids.contains(TestServicesCache.SYSTEM_IMAGE_UID)); +        assertFalse("UID must be updated to the new value", uids.contains(2)); +    } + +    public void testGetAllServicesServiceRemoved() { +        TestServicesCache cache = new TestServicesCache(mContext, mDataDir); +        cache.addServiceForQuerying(0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, 1)); +        cache.addServiceForQuerying(0, r2, new RegisteredServicesCache.ServiceInfo<>(t2, null, 2)); +        assertEquals(2, cache.getAllServicesSize(0)); +        assertEquals(2, cache.getPersistentServicesSize(0)); +        // Re-read data from disk and verify services were saved +        cache = new TestServicesCache(mContext, mDataDir); +        assertEquals(2, cache.getPersistentServicesSize(0)); +        // Now register only one service and verify that another one is removed +        cache.addServiceForQuerying(0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, 1)); +        assertEquals(1, cache.getAllServicesSize(0)); +        assertEquals(1, cache.getPersistentServicesSize(0)); +    } + +    public void testGetAllServicesMultiUser() { +        TestServicesCache cache = new TestServicesCache(mContext, mDataDir); +        int u0 = 0; +        int u1 = 1; +        int pid1 = 1; +        cache.addServiceForQuerying(u0, r1, new RegisteredServicesCache.ServiceInfo<>(t1, null, +                pid1)); +        int u1uid = UserHandle.getUid(u1, 0); +        cache.addServiceForQuerying(u1, r2, new RegisteredServicesCache.ServiceInfo<>(t2, null, +                u1uid)); +        assertEquals(u1, cache.getAllServicesSize(u0)); +        assertEquals(u1, cache.getPersistentServicesSize(u0)); +        assertEquals(u1, cache.getAllServicesSize(u1)); +        assertEquals(u1, cache.getPersistentServicesSize(u1)); +        assertEquals("No services should be available for user 3", 0, cache.getAllServicesSize(3)); +        // Re-read data from disk and verify services were saved +        cache = new TestServicesCache(mContext, mDataDir); +        assertEquals(u1, cache.getPersistentServicesSize(u0)); +        assertEquals(u1, cache.getPersistentServicesSize(u1)); +    } + +    /** +     * Mock implementation of {@link android.content.pm.RegisteredServicesCache} for testing +     */ +    private static class TestServicesCache extends RegisteredServicesCache<TestServiceType> { +        static final String SERVICE_INTERFACE = "RegisteredServicesCacheTest"; +        static final String SERVICE_META_DATA = "RegisteredServicesCacheTest"; +        static final String ATTRIBUTES_NAME = "test"; +        // Represents UID of a system image process +        static final int SYSTEM_IMAGE_UID = 20; +        private SparseArray<Map<ResolveInfo, ServiceInfo<TestServiceType>>> mServices +                = new SparseArray<>(); + +        public TestServicesCache(Context context, File dir) { +            super(context, SERVICE_INTERFACE, SERVICE_META_DATA, ATTRIBUTES_NAME, +                    new TestSerializer(), dir); +        } + +        @Override +        public TestServiceType parseServiceAttributes(Resources res, String packageName, +                AttributeSet attrs) { +            return null; +        } + +        @Override +        protected List<ResolveInfo> queryIntentServices(int userId) { +            Map<ResolveInfo, ServiceInfo<TestServiceType>> map = mServices +                    .get(userId, new HashMap<ResolveInfo, ServiceInfo<TestServiceType>>()); +            return new ArrayList<>(map.keySet()); +        } + +        void addServiceForQuerying(int userId, ResolveInfo resolveInfo, +                ServiceInfo<TestServiceType> serviceInfo) { +            Map<ResolveInfo, ServiceInfo<TestServiceType>> map = mServices.get(userId); +            if (map == null) { +                map = new HashMap<>(); +                mServices.put(userId, map); +            } +            map.put(resolveInfo, serviceInfo); +        } + +        void clearServicesForQuerying() { +            mServices.clear(); +        } + +        int getPersistentServicesSize(int user) { +            return getPersistentServices(user).size(); +        } + +        int getAllServicesSize(int user) { +            return getAllServices(user).size(); +        } + +        @Override +        protected boolean inSystemImage(int callerUid) { +            return callerUid == SYSTEM_IMAGE_UID; +        } + +        @Override +        protected ServiceInfo<TestServiceType> parseServiceInfo( +                ResolveInfo resolveInfo) throws XmlPullParserException, IOException { +            int size = mServices.size(); +            for (int i = 0; i < size; i++) { +                Map<ResolveInfo, ServiceInfo<TestServiceType>> map = mServices.valueAt(i); +                ServiceInfo<TestServiceType> serviceInfo = map.get(resolveInfo); +                if (serviceInfo != null) { +                    return serviceInfo; +                } +            } +            throw new IllegalArgumentException("Unexpected service " + resolveInfo); +        } +    } + +    static class TestSerializer implements XmlSerializerAndParser<TestServiceType> { + +        public void writeAsXml(TestServiceType item, XmlSerializer out) throws IOException { +            out.attribute(null, "type", item.type); +            out.attribute(null, "value", item.value); +        } + +        public TestServiceType createFromXml(XmlPullParser parser) +                throws IOException, XmlPullParserException { +            final String type = parser.getAttributeValue(null, "type"); +            final String value = parser.getAttributeValue(null, "value"); +            return new TestServiceType(type, value); +        } +    } + +    static class TestServiceType implements Parcelable { +        final String type; +        final String value; + +        public TestServiceType(String type, String value) { +            this.type = type; +            this.value = value; +        } + +        @Override +        public boolean equals(Object o) { +            if (this == o) { +                return true; +            } +            if (o == null || getClass() != o.getClass()) { +                return false; +            } + +            TestServiceType that = (TestServiceType) o; + +            return type.equals(that.type) && value.equals(that.value); +        } + +        @Override +        public int hashCode() { +            return 31 * type.hashCode() + value.hashCode(); +        } + +        @Override +        public String toString() { +            return "TestServiceType{" + +                    "type='" + type + '\'' + +                    ", value='" + value + '\'' + +                    '}'; +        } + +        public int describeContents() { +            return 0; +        } + +        public void writeToParcel(Parcel dest, int flags) { +            dest.writeString(type); +            dest.writeString(value); +        } + +        public TestServiceType(Parcel source) { +            this(source.readString(), source.readString()); +        } + +        public static final Creator<TestServiceType> CREATOR = new Creator<TestServiceType>() { +            public TestServiceType createFromParcel(Parcel source) { +                return new TestServiceType(source); +            } + +            public TestServiceType[] newArray(int size) { +                return new TestServiceType[size]; +            } +        }; +    } +} diff --git a/docs/html/about/versions/android-5.0-changes.jd b/docs/html/about/versions/android-5.0-changes.jd index 3de5c3c21d6e..f51af407a391 100644 --- a/docs/html/about/versions/android-5.0-changes.jd +++ b/docs/html/about/versions/android-5.0-changes.jd @@ -24,13 +24,6 @@ sdk.platform.apiLevel=21    <li><a href="#managed_profiles">Support for Managed Profiles</a></li>  </ol> -<a class="notice-developers-video" href="https://www.youtube.com/watch?v=Uiq2kZ2JHVY"> -<div> -    <h3>Video</h3> -    <p>Notifications</p> -</div> -</a> -  <h2>API Differences</h2>  <ol>  <li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 »</a> </li> @@ -48,6 +41,20 @@ sdk.platform.apiLevel=21  </div>  </div> +<a class="notice-developers-video" href="https://www.youtube.com/watch?v=um1S2u022HA"> +<div> +    <h3>Video</h3> +    <p>Dev Byte: What's New in Android 5.0</p> +</div> +</a> + +<a class="notice-developers-video" href="https://www.youtube.com/watch?v=Uiq2kZ2JHVY"> +<div> +    <h3>Video</h3> +    <p>Dev Byte: Notifications</p> +</div> +</a> +  <p>API Level: {@sdkPlatformApiLevel}</p>  <p>Along with new features and capabilities, Android 5.0 includes a variety of  system changes and API behavior changes. This document highlights diff --git a/docs/html/google/gcm/adv.jd b/docs/html/google/gcm/adv.jd deleted file mode 100644 index 95497e3049b5..000000000000 --- a/docs/html/google/gcm/adv.jd +++ /dev/null @@ -1,410 +0,0 @@ -page.title=GCM Advanced Topics -@jd:body - -<div id="qv-wrapper"> -<div id="qv"> - -<h2>Quickview</h2> - -<ul> -<li>Learn more about GCM advanced features.</li> -</ul> - - -<h2>In this document</h2> - -<ol> -<li><a href="#lifetime">Lifetime of a Message</a></li> -<li><a href="#throttling">Throttling</a></li> -<li><a href="#reg-state">Keeping the Registration State in Sync</a> -  <ol> -    <li><a href="#canonical">Canonical IDs</a></li> -  </ol> -</li> -<li><a href="#retry">Automatic Retry Using Exponential Back-Off</a></li> -<li><a href="#unreg">Unregistration</a> -  <ol> -    <li><a href="#unreg-why">Why you should rarely unregister</a></li> -    <li><a href="#unreg-how">How unregistration works</a></li> -  </ol> -</li> -<li><a href="#collapsible">Send-to-Sync vs. Messages with Payload</a> -  <ol> -    <li><a href="#s2s">Send-to-sync messages</a></li> -    <li><a href="#payload">Messages with payload</a></li> -<li><a href="#which">Which should I use?</a></li> -    </ol> -</li> -<li><a href="#ttl">Setting an Expiration Date for a Message</a> </li> -<li><a href="#throttling"></a><a href="#multi-senders">Receiving Messages from -Multiple Senders</a></li> -</ol> - -</div> -</div> -<p>This document covers advanced topics for GCM.</p> - - - - -<h2 id="msg-lifetime">Lifetime of a Message</h2> -<p>When a 3rd-party server posts a message to GCM and receives a message ID back, -it does not mean that the message was already delivered to the device. Rather, it -means that it was accepted for delivery. What happens to the message after it is -accepted depends on many factors.</p> - -<p>In the best-case scenario, if the device is connected to GCM, the screen is on, -and there are no throttling restrictions (see <a href="#throttling">Throttling</a>), -the message will be delivered right away.</p> - -<p>If the device is connected but idle, the message will still be -delivered right away unless the <code>delay_while_idle</code> flag is set to true. -Otherwise, it will be stored in the GCM servers until the device is awake. And -that's where the <code>collapse_key</code> flag plays a role: if there is already -a message with the same collapse key (and registration ID) stored and waiting for -delivery, the old message will be discarded and the new message will take its place -(that is, the old message will be collapsed by the new one). However, if the collapse -key is not set, both the new and old messages are stored for future delivery. -Collapsible messages are also called <a href="#s2s">send-to-sync messages</a>.</p> - -<p class="note"><strong>Note:</strong> There is a limit on how many messages can -be stored without collapsing. That limit is currently 100. If the limit is reached, -all stored messages are discarded. Then when the device is back online, it receives -a special message indicating that the limit was reached. The application can then -handle the situation properly, typically by requesting a full sync. -<br><br> -Likewise, there is a limit on how many <code>collapse_key</code>s you can have for -a particular device. GCM allows a maximum of 4 different collapse keys to be used -by the GCM server per device -any given time. In other words, the GCM server can simultaneously store 4 different -send-to-sync messages, each with a different collapse key. If you exceed this number -GCM will only keep 4 collapse keys, with no guarantees about which ones they will be. -See <a href="#s2s">Send-to-sync messages</a> for more information. -</p> - -<p>If the device is not connected to GCM, the message will be stored until a -connection is established (again respecting the collapse key rules). When a connection -is established, GCM will deliver all pending messages to the device, regardless of -the <code>delay_while_idle</code> flag. If the device never gets connected again -(for instance, if it was factory reset), the message will eventually time out and -be discarded from GCM storage. The default timeout is 4 weeks, unless the -<code>time_to_live</code> flag is set.</p> - -<p>Finally, when GCM attempts to deliver a message to the device and the -application was uninstalled, GCM will discard that message right away and -invalidate the registration ID. Future attempts to send a message to that device -will get a <code>NotRegistered</code> error. See <a href="#unreg"> -How Unregistration Works</a> for more information.</p> -<p>Although is not possible to track the status of each individual message, the -Google Cloud Console stats are broken down by messages sent to device, messages -collapsed, and messages waiting for delivery.</p> - -<h2 id="throttling">Throttling</h2> -<p>To prevent abuse (such as sending a flood of messages to a device) and -to optimize for the overall network efficiency and battery life of -devices, GCM implements throttling of messages using a token bucket -scheme. Messages are throttled on a per application and per <a href="#collapsible">collapse -key</a> basis (including non-collapsible messages). Each application -collapse key is granted some initial tokens, and new tokens are granted -periodically therefter. Each token is valid for a single message sent to -the device. If an application collapse key exhausts its supply of -available tokens, new messages are buffered in a pending queue until -new tokens become available at the time of the periodic grant. Thus -throttling in between periodic grant intervals may add to the latency -of message delivery for an application collapse key that sends a large -number of messages within a short period of time. Messages in the pending -queue of an application collapse key may be delivered before the time -of the next periodic grant, if they are piggybacked with messages -belonging to a non-throttled category by GCM for network and battery -efficiency reasons.</p> - -<h2 id="reg-state">Keeping the Registration State in Sync</h2> -<p>Whenever the application registers as described in -<a href="{@docRoot}google/gcm/client.html">Implementing GCM Client</a>, -it should save the registration ID for future use, pass it to the -3rd-party server to complete the registration, and keep track of -whether the server completed the registration. If the server fails -to complete the registration, it should try again or unregister from GCM.</p> - -<p>There are also two other scenarios that require special care:</p> -<ul> -  <li>Application update</li> -  <li>Backup and restore -  </li> -</ul> -<p>When an application is updated, it should invalidate its existing registration -ID, as it is not guaranteed to work with the new version.  Because there is no -lifecycle method called when the application is updated, the best way to achieve -this validation is by storing the current application version when a registration -ID is stored. Then when the application is started, compare the stored value with -the current application version. If they do not match, invalidate the stored data -and start the registration process again.</p> - -<p>Similarly, you should not save the registration ID when an application is -backed up. This is because the registration ID could become invalid by the time -the application is restored, which would put the application in an invalid state -(that is, the application thinks it is registered, but the server and GCM do not -store that registration ID anymore—thus the application will not get more -messages).</p> -<h3 id="canonical">Canonical IDs</h3> -<p>On the server side, as long as the application is behaving well, everything -should work normally. However, if a bug in the application triggers multiple -registrations for the same device, it can be hard to reconcile state and you might -end up with duplicate messages.</p> -<p>GCM provides a facility called "canonical registration IDs" to easily -recover from these situations. A canonical registration ID is defined to be the ID -of the last registration requested by your application. This is the ID that the -server should use when sending messages to the device.</p> -<p>If later on you try to send a message using a different registration ID, GCM -will process the request as usual, but it will include the canonical registration -ID in the <code>registration_id</code> field of the response. Make sure to replace -the registration ID stored in your server with this canonical ID, as eventually -the ID you're using will stop working.</p> - -<h2 id="retry">Automatic Retry Using Exponential Back-Off</h2> - -<p>When registration or unregistration fails, the app should retry the failed operation.</p> -<p>In the simplest case, if your application attempts to register and GCM is not a -fundamental part of the application, the application could simply ignore the error -and try to register again the next time it starts. Otherwise, it should retry the -previous operation using exponential back-off. In exponential back-off, each time -there is a failure, it should wait twice the previous amount of time before trying -again. If the register (or unregister) operation was synchronous, it could be retried -in a simple loop. However, since it is asynchronous, the best approach is to schedule -a {@link android.app.PendingIntent} to retry the operation. - -<h2 id="unreg">Unregistration</h2> - -<p>This section explains when you should unregister in GCM and what happens -when you do.</p> - -<h3 id="unreg-why">Why you should rarely unregister</h3> - -<p>A registration ID (regID) represents a particular Android application running -on a particular device. You should only need to unregister in rare cases, such as -if you want an app to stop receiving messages, or if you suspect that the regID has -been compromised. In general, though, once an app has a regID, you shouldn't need -to change it.</p> - -<p>In particular, you should never unregister your app as a mechanism for -logout or for switching between users, for the following reasons:</p> - -<ul> -  <li>A regID maps an app to a device. It isn't associated with a particular -  logged in user. If you unregister and then re-register, GCM may return the same -  ID or a different ID—there's no guarantee either way.</li> - -  <li>Unregistration may take up to 5 minutes to propagate.</li> -  <li>After unregistration, re-registration may again take up to 5 minutes to -propagate. During this time messages may be rejected due to the state of being -unregistered, and after all this, messages may still go to the wrong user.</li> -</ul> - - -<p>The solution is to manage your own mapping between users, the regID, and -individual messages:</p> - -<ul> -  <li>Your app server should maintain a mapping between the current user -and the regID. This should include information about which user is supposed to -receive a particular message.</li> -  <li>The app running on the device should check to ensure that messages it -receives match the logged in user.</li> -</ul> - - -<h3 id="unreg-how">How unregistration works</h3> - -<p>An application can be automatically unregistered after it is uninstalled from -the device. However, this process does not happens right away, as Android does not -provide an uninstall callback. What happens in this scenario is as follows:</p> -<ol> -  <li>The end user uninstalls the application.</li> -  <li>The 3rd-party server sends a message to GCM server.</li> -  <li>The GCM server sends the message to the device.</li> -  <li>The GCM client receives the message and queries Package Manager about -whether there are broadcast receivers configured to receive it, which returns -<code>false</code>. -</li> -  <li>The GCM client informs the GCM server that the application was uninstalled.</li> -  <li>The GCM server marks the registration ID for deletion.</li> -  <li>The 3rd-party server sends a message to  GCM.</li> -  <li>The GCM returns a <code>NotRegistered</code> error message to the 3rd-party server.</li> -  <li>The 3rd-party deletes the registration ID. -  </li> -</ol> - -<p class ="note"><strong>Note:</strong> The GCM client is the Google Cloud -Messaging framework present on the device.</p> - -<p>Note that it might take a while for the registration ID be completely removed -from GCM. Thus it is possible that messages sent during step 7 above gets a valid -message ID as response, even though the message will not be delivered to the device. -Eventually, the registration ID will be removed and the server will get a -<code>NotRegistered</code> error, without any further action being required from -the 3rd-party server (this scenario happens frequently while an application is -being developed and tested).</p> - -<h2 id="collapsible">Send-to-Sync  vs. Messages with Payload</h2> - -<p>Every message sent in GCM has the following characteristics:</p> -<ul> -  <li>It has a payload limit of 4096 bytes.</li> -  <li>By default, it is stored by GCM for 4 weeks.</li> -</ul> - -<p>But despite these similarities, messages can behave very differently depending -on their particular settings. One major distinction between messages is whether -they are collapsed (where each new message replaces the preceding message) or not -collapsed (where each individual message is delivered). Every message sent in GCM -is either a "send-to-sync" (collapsible) message or a "message with -payload" (non-collapsible message). These concepts are described in more -detail in the following sections.</p> - -<h3 id="s2s">Send-to-sync messages</h3> - -<p>A send-to-sync (collapsible) message is often a "tickle" that tells -a mobile application to sync data from the server. For example, suppose you have -an email application. When a user receives new email on the server, the server -pings the mobile application with a "New mail" message. This tells the -application to sync to the server to pick up the new email. The server might send -this message multiple times as new mail continues to accumulate, before the application -has had a chance to sync. But if the user has received 25 new emails, there's no -need to preserve every "New mail" message. One is sufficient. Another -example would be a sports application that updates users with the latest score. -Only the most recent message is relevant, so it makes sense to have each new -message replace the preceding message. </p> - -<p>The email and sports applications are cases where you would probably use the -GCM <code>collapse_key</code> parameter. A <em>collapse key</em> is an arbitrary -string that is used to collapse a group of like messages when the device is offline, -so that only the most recent message gets sent to the client. For example, -"New mail," "Updates available," and so on</p> -<p>GCM allows a maximum of 4 different collapse keys to be used by the GCM server -at any given time. In other words, the GCM server can simultaneously store 4 -different send-to-sync messages per device, each with a different collapse key. -For example, Device A can have A1, A2, A3, and A4. Device B can have B1, B2, B3, -and B4, and so on. If you exceed this number GCM will only keep 4 collapse keys, with no -guarantees about which ones they will be.</p> - -<h3 id="payload">Messages with payload</h3> - -<p>Unlike a send-to-sync message, every "message with payload" -(non-collapsible message) is delivered. The payload the message contains can be -up to 4kb. For example, here is a JSON-formatted message in an IM application in -which spectators are discussing a sporting event:</p> - -<pre class="prettyprint pretty-json">{ -  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", -  "data" : { -    "Nick" : "Mario", -    "Text" : "great match!", -    "Room" : "PortugalVSDenmark", -  }, -}</pre> - -<p>A "message with payload" is not simply a "ping" to the -mobile application to contact the server to fetch data. In the aforementioned IM -application, for example, you would want to deliver every message, because every -message has different content. To specify a non-collapsible message, you simply -omit the <code>collapse_key</code> parameter. Thus GCM will send each message -individually. Note that the order of delivery is not guaranteed.</p> - -<p>GCM will store up to 100 non-collapsible messages. After that, all messages -are discarded from GCM, and a new message is created that tells the client how -far behind it is. The message is delivered through a regular -<code>com.google.android.c2dm.intent.RECEIVE</code> intent with the -extra <code>message_type</code>, for which the value is always the string -"deleted_messages".</p> - -<p>The application should respond by syncing with the server to recover the -discarded messages. </p> - -<h3 id="which">Which should I use?</h3> -  <p>If your application does not need to use non-collapsible messages, collapsible -messages are a better choice from a performance standpoint, because they put less -of a burden on the device battery. However, if you use collapsible messages, remember that -<strong>GCM only allows a maximum of 4 different collapse keys to be used by the GCM server -per device at any given time</strong>. You must not exceed this number, or it could cause -unpredictable consequences.</p> - -<h2 dir="ltr" id="ttl">Setting an Expiration Date for a Message</h2> -<p>The Time to Live (TTL) feature lets  the sender  specify the maximum lifespan -of a message using the <code>time_to_live</code> parameter in the send request. -The value of this parameter must be a duration from 0 to 2,419,200 seconds, and -it corresponds to the maximum period of time for which GCM will store and try to -deliver the message. Requests that don't contain this field default to the maximum -period of 4 weeks.</p> -<p>Here are some possible uses for this feature:</p> -<ul> -  <li>Video chat incoming calls</li> -  <li>Expiring invitation events</li> -  <li>Calendar events</li> -</ul> -<h3 id="bg">Background </h3> -<p>GCM will usually deliver messages immediately after they are sent. However, -this might not always be possible. For example, the device could be turned off, -offline, or otherwise unavailable. In other cases, the sender itself might request -that messages not be delivered until the device becomes active by using the -<code>delay_while_idle</code> flag. Finally, GCM might intentionally delay messages -to prevent an application from consuming excessive resources and negatively -impacting battery life.</p> - -<p>When this happens, GCM will store the message and deliver it as soon as it's -feasible. While this is fine in most cases, there are some applications for which -a late message might as well never be delivered. For example, if the message is -an incoming call or video chat notification, it will only be meaningful for a -small period of time before the call is terminated. Or if the message is an -invitation to an event, it will be useless if received after the event has ended.</p> - -<p>Another advantage of specifying the expiration date for a message is that GCM -will never throttle messages with a <code>time_to_live</code> value of 0 seconds. -In other words, GCM will guarantee best effort for messages that must be delivered -"now or never." Keep in mind that a <code>time_to_live</code> value of -0 means messages that can't be delivered immediately will be discarded. However, -because such messages are never stored, this provides the best latency for -sending notifications.</p> - -<p>Here is an example of a JSON-formatted request that includes TTL:</p> -<pre class="prettyprint pretty-json"> -{ -  "collapse_key" : "demo", -  "delay_while_idle" : true, -  "registration_ids" : ["xyz"], -  "data" : { -    "key1" : "value1", -    "key2" : "value2", -  }, -  "time_to_live" : 3 -}, -</pre> - - -<h2 id="multi-senders">Receiving Messages from Multiple Senders</h2> - -<p>GCM allows multiple parties to send messages to the same application. For -example, suppose your application is an articles aggregator with multiple -contributors, and you want each of them to be able to send a message when they -publish a new article. This message might contain a URL so that the application -can download the article. Instead of having to centralize all sending activity in -one location, GCM gives you the ability to let each of these contributors send -its own messages.</p> - -<p>To make this possible, all you need to do is have each sender generate its own -project number. Then include those IDs in the sender field, separated by commas, -when requesting a registration. Finally, share the registration ID with your -partners, and they'll be able to send messages to your application using their -own authentication keys.</p> -<p>This code snippet illustrates this feature. Senders are passed as an intent -extra in a comma-separated list:</p> - -<pre class="prettyprint pretty-java">Intent intent = new Intent(GCMConstants.INTENT_TO_GCM_REGISTRATION); -intent.setPackage(GSF_PACKAGE); -intent.putExtra(GCMConstants.EXTRA_APPLICATION_PENDING_INTENT, -        PendingIntent.getBroadcast(context, 0, new Intent(), 0)); -String senderIds = "968350041068,652183961211"; -intent.putExtra(GCMConstants.EXTRA_SENDER, senderIds); -ontext.startService(intent); - </pre> - -<p>Note that there is limit of 100 multiple senders.</p> diff --git a/docs/html/google/gcm/c2dm.jd b/docs/html/google/gcm/c2dm.jd index 5c4a86e66bdc..fc95c2b26cb6 100644 --- a/docs/html/google/gcm/c2dm.jd +++ b/docs/html/google/gcm/c2dm.jd @@ -79,7 +79,7 @@ page.title=Migration  <h3 id="interop">Relationship between C2DM and GCM</h3> -<p>C2DM and GCM are not interoperable. For example, you cannot post notifications from GCM to C2DM registration IDs, nor can you use C2DM registration IDs as GCM registration IDs. From your server-side application, you must keep keep track of whether a registration ID is from C2DM or GCM and use the proper endpoint. </p> +<p>C2DM and GCM are not interoperable. For example, you cannot post notifications from GCM to C2DM registration IDs, nor can you use C2DM registration IDs as GCM registration IDs. From your server-side application, you must keep track of whether a registration ID is from C2DM or GCM and use the proper endpoint. </p>  <p>As you transition from C2DM to GCM, your server needs to be aware of whether a given registration ID  contains an old C2DM sender or a new GCM project number. This is the approach we recommend: have the new app version (the one that uses GCM) send a bit along with the registration ID. This bit tells your server that this registration ID is for GCM. If you don't get the extra bit, you mark the registration ID as C2DM. Once no more valid registration IDs are marked as C2DM, you can complete the migration.</p> @@ -87,13 +87,11 @@ contains an old C2DM sender or a new GCM project number. This is the approach we  <h2 id="migrating">Migrating Your Apps</h2>  <p>This section describes how to move existing C2DM apps to GCM.</p>  <h3 id="client">Client changes</h3> -<p>Migration is simple! The only change required in the application is replacing the email account passed in the sender parameter of the registration intent with the project number generated when signing up for the new service. For example:</p> -<pre class="prettyprint pretty-java">Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); -// sets the app name in the intent -registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); -registrationIntent.putExtra("sender", senderID); -startService(registrationIntent);</pre> +<p>Migration is simple! Just re-register the client app for your target GCM-enabled platform. For +  example, see <a href="{@docRoot}google/gcm/client.html#sample-register">Register for GCM</a></p> +  <p>After receiving a response from GCM, the registration ID obtained must be sent to the application server. When doing this, the application should indicate that it is sending a GCM registration ID so that the server can distinguish it from existing C2DM registrations.</p> +  <h3 id="server">Server changes</h3>  <p>When the application server receives a GCM registration ID, it should store it and mark it as such.</p>  <p>Sending messages to GCM devices requires a few changes:</p> diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd index 6332b8d9b1d7..143b0574d876 100644 --- a/docs/html/google/gcm/ccs.jd +++ b/docs/html/google/gcm/ccs.jd @@ -36,6 +36,7 @@ page.title=GCM Cloud Connection Server (XMPP)  <h2>See Also</h2>  <ol class="toc"> +<li><a href="server-ref.html">Server Reference</a></li>  <li><a href="{@docRoot}google/gcm/http.html">HTTP</a></li>  <li><a href="{@docRoot}google/gcm/gs.html">Getting Started</a></li>  <li><a href="{@docRoot}google/gcm/server.html">Implementing GCM Server</a></li> @@ -73,8 +74,8 @@ Play services platform. Upstream messaging is available through the  APIs. For examples, see  <a href="#implement">Implementing an XMPP-based App Server</a>.</p> -<p class="note"><strong>Note:</strong> See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message +<p class="note"><strong>Note:</strong> See the +<a href="server-ref.html">Server Reference</a> for a list of all the message  parameters and which connection server(s) supports them.</p>  <h2 id="connecting">Establishing a Connection</h2> @@ -176,8 +177,8 @@ operation and your server needs to resend the messages. See  <a href="#flow">Flow Control</a> for details.  </p> -<p class="note"><strong>Note:</strong> See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message +<p class="note"><strong>Note:</strong> See the +<a href="server-ref.html">Server Reference</a> for a list of all the message  parameters and which connection server(s) supports them.</p>  <h3 id="request">Request format</h3> @@ -278,56 +279,11 @@ message is "nack". A NACK message contains:</p>  </message>  </pre> -<p>The following table lists NACK error codes. Unless otherwise +<p>See the <a href="server-ref.html#table11">Server Reference</a> for a complete list of the +NACK error codes. Unless otherwise  indicated, a NACKed message should not be retried. Unexpected NACK error codes  should be treated the same as {@code INTERNAL_SERVER_ERROR}.</p> -<p class="table-caption" id="table1"> -  <strong>Table 1.</strong> NACK error codes.</p> - -<table border="1"> -<tr> -<th>Error Code</th> -<th>Description</th> -</tr> -<tr> -<td>{@code BAD_ACK}</td> -<td>The ACK message is improperly formed.</td> -</tr> -<tr> -<td>{@code BAD_REGISTRATION}</td> -<td>The device has a registration ID, but it's invalid or expired.</td> -</tr> -<tr> -<td>{@code CONNECTION_DRAINING}</td> -<td>The message couldn't be processed because the connection is draining. The -message should be immediately retried over another connection.</td> -</tr> -<tr> -<td>{@code DEVICE_UNREGISTERED}</td> -<td>The device is not registered.</td> -</tr> -<tr> -<td>{@code INTERNAL_SERVER_ERROR}</td> -<td>The server encountered an error while trying to process the request.</td> -</tr> -<tr> -<td>{@code INVALID_JSON}</td> -<td>The JSON message payload is not valid.</td> -</tr> -<td>{@code DEVICE_MESSAGE_RATE_EXCEEDED}</td> -<td>The rate of messages to a particular device is too high. You should reduce -the number of messages sent to this device and should not immediately retry -sending to this device. This error code is replacing {@code QUOTA_EXCEEDED}.</td> -</tr> -<tr> -  <td>{@code SERVICE_UNAVAILABLE}</td> -  <td>CCS is not currently able to process the message. The -    message should be retried over the same connection using exponential backoff -    with an initial delay of 1 second.</td> -</tr> -</table> -  <h4 id="stanza">Stanza error</h4>  <p>You can also get a stanza error in certain cases. diff --git a/docs/html/google/gcm/client.jd b/docs/html/google/gcm/client.jd index d44ee3c6717c..9cb3f8417ea1 100644 --- a/docs/html/google/gcm/client.jd +++ b/docs/html/google/gcm/client.jd @@ -1,4 +1,4 @@ -page.title=Implementing GCM Client +page.title=Implementing GCM Client on Android  page.tags=cloud,push,messaging  @jd:body @@ -15,8 +15,8 @@ page.tags=cloud,push,messaging    <ol class="toc">      <li><a href="#sample-play">Check for Google Play Services APK</a></li>      <li><a href="#sample-register">Register for GCM</a></li> -    <li><a href="#sample-send">Send a message</a></li> -    <li><a href="#sample-receive">Receive a message</a></li> +    <li><a href="#sample-receive">Receive a downstream message</a></li> +    <li><a href="#sample-send">Send an upstream message</a></li>    </ol>    <li><a href="#run">Running the Sample</a></li>    <li><a href="#stats">Viewing Statistics</a></li> @@ -34,14 +34,26 @@ page.tags=cloud,push,messaging  </div>  </div> -<p>A Google Cloud Messaging (GCM) client is a GCM-enabled app that runs on an +<p>A Google Cloud Messaging (GCM) Android client is a GCM-enabled app that runs on an  Android device. To write your client code, we recommend that you use the  <a href="{@docRoot}reference/com/google/android/gms/gcm/package-summary.html"> -GCM APIs</a>. -The client helper library that was offered in previous versions of GCM still works, -but it has been superseded by the more efficient -<a href="{@docRoot}reference/com/google/android/gms/gcm/package-summary.html"> -GCM APIs</a>.</p> +{@code GoogleCloudMessaging}</a> API.</p> + +<p>Here are the requirements for running a GCM Android client:</p> + +<ul> +  <li>At a bare minimum, GCM requires devices running Android 2.2 or higher that also have the +Google Play Store application installed, or an emulator running Android 2.2 +with Google APIs. Note that you are not limited to deploying your +Android applications through Google Play Store.</li> +  <li>However, if you want to continue to use new GCM features that are distributed +through Google Play Services, the device must be running Android 2.3 or higher, or +you can use an emulator running Android 2.3 with Google APIs.</li> +<li>On Android devices, GCM uses an existing connection for Google services. For +pre-3.0 devices, this requires users to set up their Google accounts on their mobile +devices. A Google account is not a requirement on devices running Android 4.0.4 or higher.</li> + +</ul>  <p>A full GCM implementation requires both a client implementation and a server  implementation. For more @@ -58,7 +70,7 @@ registration ID), and a broadcast receiver to receive messages sent by GCM.  <p>To write your client application, use the  <a href="{@docRoot}reference/com/google/android/gms/gcm/package-summary.html"> -GCM APIs</a>. +{@code GoogleCloudMessaging}</a> API.  To use this API, you must set up your project to use the Google Play services SDK,  as described in <a href="/google/play-services/setup.html">Setup Google Play  Services SDK</a>.</p> @@ -88,9 +100,6 @@ If you're using Android Studio, this is the string to add to the  the Android application can register and receive messages.</li>    <li>The <code>android.permission.INTERNET</code> permission so the Android  application can send the registration ID to the 3rd party server.</li> -  <li>The <code>android.permission.GET_ACCOUNTS</code> permission as GCM requires -a Google account (necessary only if if the device is running a version lower than -Android 4.0.4)</li>    <li>The <code>android.permission.WAKE_LOCK</code> permission so the application  can keep the processor from sleeping when a message is received. Optional—use  only if the app wants to keep the device from sleeping.</li> @@ -101,7 +110,7 @@ pattern—otherwise the Android application will not receive the messages.</     <li>A receiver for <code>com.google.android.c2dm.intent.RECEIVE</code>, with  the category set  as <code>applicationPackage</code>. The receiver should require the -<code>com.google.android.c2dm.SEND</code> permission, so that only the GCM +<code>com.google.android.c2dm.permission.SEND</code> permission, so that only the GCM  Framework can send a message to it. If your app uses an {@link android.app.IntentService}  (not required, but a common pattern), this receiver should be an instance of  {@link android.support.v4.content.WakefulBroadcastReceiver}. @@ -324,8 +333,8 @@ private String getRegistrationId(Context context) {          return "";      }      // Check if app was updated; if so, it must clear the registration ID -    // since the existing regID is not guaranteed to work with the new -    // app version. +    // since the existing registration ID is not guaranteed to work with +    // the new app version.      int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);      int currentVersion = getAppVersion(context);      if (registeredVersion != currentVersion) { @@ -340,14 +349,14 @@ private String getRegistrationId(Context context) {   */  private SharedPreferences getGCMPreferences(Context context) {      // This sample app persists the registration ID in shared preferences, but -    // how you store the regID in your app is up to you. +    // how you store the registration ID in your app is up to you.      return getSharedPreferences(DemoActivity.class.getSimpleName(),              Context.MODE_PRIVATE);  }</pre>  <p>If the registration ID doesn't exist or the app was updated,  {@code getRegistrationId()} returns an empty string -to indicate that the app needs to get a new regID. {@code getRegistrationId()} calls +to indicate that the app needs to get a new registration ID. {@code getRegistrationId()} calls  the following method to check the app version:</p>  <pre>/** @@ -400,7 +409,7 @@ private void registerInBackground() {                  // will send upstream messages to a server that echo back the                  // message using the 'from' address in the message. -                // Persist the regID - no need to register again. +                // Persist the registration ID - no need to register again.                  storeRegistrationId(context, regid);              } catch (IOException ex) {                  msg = "Error :" + ex.getMessage(); @@ -433,7 +442,8 @@ private void sendRegistrationIdToBackend() {  <p>After registering, the app calls {@code storeRegistrationId()} to store the  registration ID in shared preferences for future use. This is just one way of -persisting a regID. You might choose to use a different approach in your app:</p> +persisting a registration ID. You might choose to use a different approach in +your app:</p>  <pre>/**   * Stores the registration ID and app versionCode in the application's @@ -455,64 +465,22 @@ private void storeRegistrationId(Context context, String regId) {  <h4 id="reg-errors">Handle registration errors</h4>  <p>As stated above, an Android app must register with GCM servers and get a registration ID -(regID) before it can receive messages. A given regID is not guaranteed to last indefinitely, -so the first thing your app should always do is check to make sure it has a valid regID -(as shown in the code snippets above).</p> +before it can receive messages. A given registration ID is not guaranteed to last indefinitely, +so the first thing your app should always do is check to make sure it has a valid +registration ID (as shown in the code snippets above).</p> -<p>In addition to confirming that it has a valid regID, your app should be prepared to handle +<p>In addition to confirming that it has a valid registration ID, your app should be prepared to handle  the registration error {@code TOO_MANY_REGISTRATIONS}. This error indicates that the device  has too many apps registered with GCM. The error only occurs in cases where there are  extreme numbers of apps, so it should not affect the average user. The remedy is to prompt -the user to delete some of the other GCM-enabled apps from the device to make +the user to delete some of the other client apps from the device to make  room for the new one.</p> - -<h3 id="sample-send">Send a message</h3> -<p>When the user clicks the app's <strong>Send</strong> button, the app sends an -upstream message using the -<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> API. In order to receive the upstream message, -your server should be connected to CCS. You can use one of the demo servers in -<a href="ccs.html#implement">Implementing an XMPP-based App Server</a> to run the sample and connect -to CCS.</p> - -<pre>public void onClick(final View view) { -    if (view == findViewById(R.id.send)) { -        new AsyncTask<Void, Void, String>() { -            @Override -            protected String doInBackground(Void... params) { -                String msg = ""; -                try { -                    Bundle data = new Bundle(); -                        data.putString("my_message", "Hello World"); -                        data.putString("my_action", -                                "com.google.android.gcm.demo.app.ECHO_NOW"); -                        String id = Integer.toString(msgId.incrementAndGet()); -                        gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data); -                        msg = "Sent message"; -                } catch (IOException ex) { -                    msg = "Error :" + ex.getMessage(); -                } -                return msg; -            } - -            @Override -            protected void onPostExecute(String msg) { -                mDisplay.append(msg + "\n"); -            } -        }.execute(null, null, null); -    } else if (view == findViewById(R.id.clear)) { -        mDisplay.setText(""); -    } -}</pre> - -<h3 id="sample-receive">Receive a message</h3> +<h3 id="sample-receive">Receive a downstream message</h3>  <p>As described above in <a href="#manifest">Step 2</a>, the app includes a  {@link android.support.v4.content.WakefulBroadcastReceiver} for the <code>com.google.android.c2dm.intent.RECEIVE</code> -intent. A broadcast receiver is the mechanism GCM uses to deliver messages. When {@code onClick()} -calls {@code gcm.send()}, it triggers the broadcast receiver's {@code onReceive()} -method, which has the responsibility of making sure that the GCM message gets handled.</p> +intent. A broadcast receiver is the mechanism GCM uses to deliver messages. </p>  <p>A {@link android.support.v4.content.WakefulBroadcastReceiver} is a special type of  broadcast receiver that takes care of  creating and managing a @@ -646,6 +614,46 @@ public class GcmIntentService extends IntentService {      }  }</pre> + +<h3 id="sample-send">Send an upstream message</h3> +<p>When the user clicks the app's <strong>Send</strong> button, the app sends an +upstream message using the +<a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> +{@code GoogleCloudMessaging}</a> API. In order to receive the upstream message, +your server should be connected to CCS. You can use one of the demo servers in +<a href="ccs.html#implement">Implementing an XMPP-based App Server</a> to run the sample and connect +to CCS.</p> + +<pre>public void onClick(final View view) { +    if (view == findViewById(R.id.send)) { +        new AsyncTask<Void, Void, String>() { +            @Override +            protected String doInBackground(Void... params) { +                String msg = ""; +                try { +                    Bundle data = new Bundle(); +                        data.putString("my_message", "Hello World"); +                        data.putString("my_action", +                                "com.google.android.gcm.demo.app.ECHO_NOW"); +                        String id = Integer.toString(msgId.incrementAndGet()); +                        gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data); +                        msg = "Sent message"; +                } catch (IOException ex) { +                    msg = "Error :" + ex.getMessage(); +                } +                return msg; +            } + +            @Override +            protected void onPostExecute(String msg) { +                mDisplay.append(msg + "\n"); +            } +        }.execute(null, null, null); +    } else if (view == findViewById(R.id.clear)) { +        mDisplay.setText(""); +    } +}</pre> +  <h2 id="run">Running the Sample</h2>  <p>To run the sample:</p> diff --git a/docs/html/google/gcm/gcm.jd b/docs/html/google/gcm/gcm.jd index 3d6594da8c9d..4e345b314a00 100644 --- a/docs/html/google/gcm/gcm.jd +++ b/docs/html/google/gcm/gcm.jd @@ -9,58 +9,24 @@ page.title=Overview  <ol class="toc">    <li><a href="#key">Key Concepts</a></li>    <li><a href="#arch">Architectural Overview</a></li> -  <li><a href="#lifecycle">Lifecycle Flow</a> -    <ol class="toc"> -      <li><a href="#register">Enable GCM</a></li> -      <li><a href="#push-process">Send a message</a></li> -      <li><a href="#receiving">Receive a message</a></li> -    </ol> -  </li> +  <li><a href="#lifecycle">Lifecycle Flow</a></li> +  <li><a href="#reg">Register to enable GCM</a></li>  </ol>  </div>  </div> -<p>Google Cloud Messaging (GCM) for Android is a free service that helps -developers  send data from servers to their Android applications on  Android -devices, and upstream messages from the user's device back to the cloud. -This could be a lightweight message telling the Android application +<p>Google Cloud Messaging (GCM) is a free service that enables developers +to send downstream messages (from servers to GCM-enabled client apps), and +upstream messages (from the GCM-enabled client apps to servers). +This could be a lightweight message telling the client app  that there is new data to be fetched from the server (for instance, a "new email" -notification informing the application that it is out of sync with the back end), +notification informing the app that it is out of sync with the back end),  or it could be a message containing up to 4kb of payload  data (so apps like instant messaging can consume the message directly). The GCM -service handles all aspects  of queueing of messages and delivery to the target -Android application running  on the target device.</p> -   -<p class="note"> To jump right into using GCM with your Android -  applications, see <a href="gs.html">Getting Started</a>.</p> +service handles all aspects of queueing of messages and delivery to and from +the target client app.</p> -<p>Here are the primary characteristics of Google Cloud  -Messaging (GCM):</p> - -<ul> -  <li>It allows 3rd-party application servers to send messages to -their Android applications.</li> -  <li>Using the <a href="ccs.html">GCM Cloud Connection Server</a>, you can receive -upstream messages from the user's device.</li> -  <li>An Android application on an Android device doesn't need to be running to receive -messages. The system will wake up the Android application via Intent broadcast -when the  message arrives, as long as the application is set up with the proper -broadcast receiver and permissions.</li> -  <li>It does not provide any  built-in user interface or other handling for -message data. GCM  simply passes raw message data received straight to the -Android application,  which has full control of how to handle it. For example, the -application might post a notification, display a custom user interface, or  -silently sync data.</li> -  <li>It requires devices running Android 2.2 or higher that also have the -Google Play Store application installed, or or an emulator running Android 2.2 -with Google APIs. However, you are not limited to deploying your -Android applications through Google Play Store.</li> -  <li>It uses an existing connection for Google services. For pre-3.0 devices, -this requires users to -set up their Google account on their mobile devices. A Google account is not a -requirement on devices running Android 4.0.4 or higher.</li> -</ul>  <h2 id="key">Key Concepts</h2> @@ -70,7 +36,7 @@ divided into these categories:</p>    <li><strong>Components</strong> — The entities that play a primary role in  GCM.</li>    <li><strong>Credentials</strong> — The IDs and tokens that are used in -different stages of GCM to ensure that all parties have been authenticated, and +GCM to ensure that all parties have been authenticated, and  that the message is going to the correct place.</li>  </ul> @@ -81,24 +47,20 @@ that the message is going to the correct place.</li>    <tr>      <th colspan="2">Components</th>    </tr> -  <tr> -    <td width="165"><strong>Client App</strong></td> -    <td width="1176">The GCM-enabled Android application that is running on a -    device. This must be a 2.2 Android device that has Google Play Store installed, and it must -have at least one logged in Google account if the device is running a version -lower than Android 4.0.4. Alternatively, for testing you can use an emulator -running Android 2.2 with Google APIs.</td> +<tr> +    <td><strong>GCM Connection Servers</strong></td> +    <td>The Google-provided servers involved in sending messages between the +3rd-party app server and the client app.</td>    </tr>    <tr> -    <td><strong>3rd-party Application Server</strong></td> -    <td>An application server that you write as part of implementing -GCM. The 3rd-party application server sends data to an -Android application on the device via the GCM connection server.</td> +    <td><strong>Client App</strong></td> +    <td>A GCM-enabled client app that communicates with a 3rd-party app server.</td>    </tr>    <tr> -    <td><strong>GCM Connection Servers</strong></td> -    <td>The Google-provided servers involved in taking messages from the 3rd-party -application server and sending them to the device. </td> +    <td><strong>3rd-party App Server</strong></td> +    <td>An app server that you write as part of implementing +GCM. The 3rd-party app server sends data to a client app via +the GCM connection server.</td>    </tr>    <tr>      <th colspan="2">Credentials</th> @@ -108,43 +70,29 @@ application server and sending them to the device. </td>      <td>A project number you acquire from the API console, as described in  <a href="gs.html#create-proj">Getting Started</a>. The sender  ID is used in the <a href="#register">registration process</a> to identify a -3rd-party application server that is permitted to send messages to the device.</td> +3rd-party app server that is permitted to send messages to the client app.</td> +  </tr> +  <tr> +    <td id="apikey"><strong>Sender Auth Token</strong></td> +    <td>An API key that is saved on the 3rd-party app +server that gives the app server authorized access to Google services. +The API key is included in the header of POST requests. +</td>    </tr>    <tr>      <td><strong>Application ID</strong></td> -    <td>The Android application that is registering to receive messages. The Android application +    <td>The client app that is registering to receive messages. How this is implemented +is platform-dependent. For example, an Android app  is identified by the package name from the <a href="client.html#manifest">manifest</a>. -This  ensures that the messages are targeted to the correct Android application.</td> +This  ensures that the messages are targeted to the correct Android app.</td>    </tr>    <tr>      <td><strong>Registration ID</strong></td> -    <td>An ID issued by the GCM servers to the Android application that allows -it to receive messages. Once the Android application has the registration ID, it sends -it to the 3rd-party application server, which uses it to identify each device  -that has registered to receive messages for a given Android application. In other words, -a registration ID is tied to a particular Android application running on a particular -device. Note that registration IDs must be kept secret. -<br/> -<br/> -<strong>Note:</strong> If you use  -<a href="https://developer.android.com/google/backup/index.html">backup and restore</a>, -you should explicitly avoid backing up registration IDs. When you back up -a device, apps back up shared prefs indiscriminately. If you don't explicitly -exclude the GCM registration ID, it could get reused on a new device, -which would cause delivery errors. +    <td>An ID issued by the GCM servers to the client app that allows +it to receive messages. Note that registration IDs must be kept secret. +  </td>    </tr> -  <tr> -    <td><strong>Google User Account</strong></td> -    <td>For GCM to work, the mobile device must include at least one Google -account if the device is running a version lower than Android 4.0.4.</td> -  </tr> -  <tr> -    <td id="apikey"><strong>Sender Auth Token</strong></td> -    <td>An API key that is saved on the 3rd-party application -server that gives the application server authorized access to Google services. -The API key is included in the header of POST requests  that send messages.</td> -  </tr>  </table> @@ -152,7 +100,8 @@ The API key is included in the header of POST requests  that send messages.</td>  <p>A GCM implementation includes a Google-provided  connection server, a 3rd-party app server that interacts with the connection -server, and a GCM-enabled client app running on an Android device:</p> +server, and a GCM-enabled client app. For example, this diagram shows GCM +communicating with a client app on an Android device:</p>  <img src="{@docRoot}images/gcm/GCM-arch.png"> @@ -163,84 +112,196 @@ server, and a GCM-enabled client app running on an Android device:</p>  <p>This is how these components interact:</p>  <ul>    <li>Google-provided <strong>GCM Connection Servers</strong> take messages from -a 3rd-party application server and send these messages to a -GCM-enabled Android application (the "client app") running on a device. +a 3rd-party app server and send these messages to a +GCM-enabled client app (the "client app").  Currently Google provides connection servers for <a href="http.html">HTTP</a>  and <a href="ccs.html">XMPP</a>.</li> -  <li>The <strong>3rd-Party Application Server</strong> is a component that you +  <li>The <strong>3rd-Party App Server</strong> is a component that you  implement to work with your chosen GCM connection server(s). App servers send  messages to a GCM connection server; the connection server enqueues and stores the -message, and then sends it to the device when the device is online. +message, and then sends it to the client app.  For more information, see <a href="server.html">Implementing GCM Server</a>.</li> -  <li>The <strong>Client App</strong> is a GCM-enabled Android application running -on a device. To receive GCM messages, this app must register with GCM and get a +  <li>The <strong>Client App</strong> is a GCM-enabled client app. +To receive GCM messages, this app must register with GCM and get a  registration ID. If you are using the <a href="ccs.html">XMPP</a> (CCS) connection -server, the client app can send "upstream" messages back to the connection server. +server, the client app can send "upstream" messages back to the 3rd-party app server.  For more information on how to implement the client app, see -<a href="client.html">Implementing GCM Client</a>.</li> +the documentation for your platform.</li>  </ul>  <h2 id="lifecycle">Lifecycle Flow</h2>  <ul> -  <li><a href="#register">Enable GCM</a>. An Android application running on a -mobile device registers to receive messages.</li> +  <li><strong>Register to enable GCM</strong>. A client app registers to receive messages. +For more discussion, see <a href="#register">Register to enable GCM</a>.</li> +  <li><strong>Send and receive downstream messages</strong>. +  <ul> +     <li>Send a message. A 3rd-party app server sends messages to the client app: +       <ol> +         <li>The 3rd-party app server <a href="server.html#send-msg">sends a message</a> +to GCM connection servers.</li> +         <li>The GCM connection server enqueues and stores the message if the device is offline.</li> +         <li>When the device is online, the GCM connection server sends the message to the device. </li> +         <li>On the device, the client app receives the message according to the platform-specific implementation. +See your platform-specific documentation for details.</li> +       </ol> +    </li> +  <li>Receive a message. A client app +receives a message from a GCM server. See your platform-specific documentation for details +on how a client app in that environment processes the messages it receives.</li> +  </ul> +</li> + +  <li><strong>Send and receive upstream messages</strong>. This feature is only available if +you're using the <a href="ccs.html">XMPP Cloud Connection Server</a> (CCS). +<ul> +     <li>Send a message. A client app sends messages to the 3rd-party app server: +      <ol> +        <li>On the device, the client app sends messages to XMPP (CCS).See your platform-specific +          documentation for details on how a client app can send a message to XMPP (CCS).</li> +        <li>XMPP (CCS) enqueues and stores the message if the server is disconnected.</li> +        <li>When the 3rd-party app server is re-connected, XMPP (CCS) sends the message to the 3rd-party app server.</li> +      </ol> +    </li> +  <li>Receive a message. A 3rd-party app server receives a message from XMPP (CCS) and then does the following: +      <ol> +        <li>Parses the message header to verify client app sender information. +        <li>Sends "ack" to GCM XMPP connection server to acknowledge receiving the message. +        <li>Optionally parses the message payload, as defined by the client app. +      </ol> +</li> +</ul> + +</li> + -  <li><a href="#push-process">Send a message</a>. A 3rd-party application -server sends messages to the device.</li> -  <li><a href="#receiving">Receive a message</a>. An Android application -receives a message from a GCM server.</li>  </ul> -<p>These processes are described in more detail below.</p> +<h2 id="reg">Register to enable GCM</h2> + +<p>Regardless of the platform you're developing on, the first step +a client app must do is register with GCM. This section covers some of the general +best practices for registration and unregistration. See your platform-specific docs for +details on writing a GCM-enabled client app on that platform.</p> -<h3 id="register">Enable GCM</h3> +<h3 id="reg-state">Keeping the Registration State in Sync</h3> +<p>Whenever the app registers as described in +<a href="{@docRoot}google/gcm/client.html">Implementing GCM Client</a>, +it should save the registration ID for future use, pass it to the +3rd-party server to complete the registration, and keep track of +whether the server completed the registration. If the server fails +to complete the registration, the client app should retry passing the +registration ID to 3rd-party app server to complete the registration. +If this continues to fail, the client app should unregister from GCM.</p> -<p>The first time the Android application needs to use the messaging service, it -calls the <a href="{@docRoot}reference/com/google/android/gms/gcm/GoogleCloudMessaging.html"> -{@code GoogleCloudMessaging}</a> method {@code register()}, as discussed in -<a href="client.html">Implementing GCM Client</a>. -The {@code register()} method returns a registration ID. The Android -application should store this ID for later use (for instance, -to check in <code>onCreate()</code> if it is already registered). +<p>There are also two other scenarios that require special care:</p> +<ul> +  <li>Client app update</li> +  <li>Backup and restore +  </li> +</ul> +<p><bold>Client app update:</bold> When a client app is updated, it should invalidate its existing registration +ID, as it is not guaranteed to work with the new version.  The recommended way to achieve +this validation is by storing the current app version when a registration +ID is stored. Then when the app starts, compare the stored value with +the current app version. If they do not match, invalidate the stored data +and start the registration process again.</p> + +<p><bold>Backup and restore: </bold> You should not save the registration ID when an app is +backed up. This is because the registration ID could become invalid by the time +the app is restored, which would put the app in an invalid state +(that is, the app thinks it is registered, but the server and GCM do not +store that registration ID anymore—thus the app will not get more +messages). The best practice is to initiate the registration process as if the app has been +installed for the first time.</p> + +<h4 id="canonical">Canonical IDs</h4> +<p>If a bug in the app triggers multiple +registrations for the same device, it can be hard to reconcile state and you might +end up with duplicate messages.</p> +<p>GCM provides a facility called "canonical registration IDs" to easily +recover from these situations. A canonical registration ID is defined to be the ID +of the last registration requested by your app. This is the ID that the +server should use when sending messages to the device.</p> +<p>If later on you try to send a message using a different registration ID, GCM +will process the request as usual, but it will include the canonical registration +ID in the <code>registration_id</code> field of the response. Make sure to replace +the registration ID stored in your server with this canonical ID, as eventually +the ID you're using will stop working.</p> + +<h3 id="retry">Automatic Retry Using Exponential Back-Off</h3> + +<p>When registration or unregistration fails, the app should retry the failed operation.</p> +<p>In the simplest case, if your app attempts to register and GCM is not a +fundamental part of the app, the app could simply ignore the error +and try to register again the next time it starts. Otherwise, it should retry the +previous operation using exponential back-off. In exponential back-off, each time +there is a failure, it should wait twice the previous amount of time before trying +again.  </p> -<h3 id="push-process">Send a message</h3> +<h3 id="unreg">Unregistration</h3> -<p>Here is the sequence of events that occurs when the application server sends a  -message:</p> +<p>This section explains when you should unregister in GCM and what happens +when you do.</p> -<ol> -  <li>The application server sends a  message to  GCM servers.</li> -  <li>Google enqueues and stores the message in case the device is -offline.</li> -  <li>When the device is online, Google sends the message to the device. </li> -  <li>On the device, the system  broadcasts the  message to the specified -Android application via Intent broadcast with proper permissions, so that only the -targeted Android application gets the message. This wakes the Android application up. The -Android application does not need to be running beforehand to receive the message.</li> -  <li>The Android application processes the message. If the Android application is doing -non-trivial processing, you may want to grab a -{@link android.os.PowerManager.WakeLock} and do any processing in a service.</li> -</ol> +<h4 id="unreg-why">Why you should rarely unregister</h4> + +<p>You should only need to unregister in rare cases, such as +if you want an app to stop receiving messages, or if you suspect that the registration ID has +been compromised. In general, once an app has a registration ID, you shouldn't need +to change it.</p> -<p> An Android application can  unregister GCM if it no longer wants to receive  -messages.</p> +<p>In particular, you should never unregister your app as a mechanism for +logout or for switching between users, for the following reasons:</p> + +<ul> +  <li>A registration ID isn't associated with a particular +  logged in user. If you unregister and then re-register, GCM may return the same +  ID or a different ID—there's no guarantee either way.</li> + +  <li>Unregistration may take up to 5 minutes to propagate.</li> +  <li>After unregistration, re-registration may again take up to 5 minutes to +propagate. During this time messages may be rejected due to the state of being +unregistered, and after all this, messages may still go to the wrong user.</li> +</ul> -<h3 id="receiving">Receive a message</h3> -<p>This is the sequence of events that occurs when an Android application -installed on a mobile device receives a message:</p> +<p>To make sure that messages go to the intended user:</p> +<ul> +  <li>Your app server can maintain a mapping between the current user +and the registration ID.</li> +  <li>The app can then check to ensure that messages it +receives match the logged in user.</li> +</ul> + + +<h4 id="unreg-how">How unregistration works</h4> + +<p>An app can be automatically unregistered after it is uninstalled. +However, this process does not happen right away. What happens in +this scenario is as follows:</p>  <ol> -  <li>The system receives the incoming message and extracts the raw key/value -pairs from the message payload, if any.</li> -  <li>The system passes the key/value pairs to the targeted Android application -in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of -extras.</li> -  <li>The Android application extracts the raw data -from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent -by key and processes the data.</li> +  <li>The end user uninstalls the client app.</li> +  <li>The 3rd-party app server sends a message to GCM server.</li> +  <li>The GCM server sends the message to the GCM client on the device.</li> +  <li>The GCM client on the device receives the message and detects that the client app has been +   uninstalled; the detection details depend on the platform on which the client app is running. +</li> +  <li>The GCM client on the device informs the GCM server that the client app was uninstalled.</li> +  <li>The GCM server marks the registration ID for deletion.</li> +  <li>The 3rd-party app server sends a message to  GCM.</li> +  <li>The GCM returns a <code>NotRegistered</code> error message to the 3rd-party app server.</li> +  <li>The 3rd-party app server deletes the registration ID. +  </li>  </ol> +<p>Note that it might take a while for the registration ID be completely removed +from GCM. Thus it is possible that messages sent during step 7 above gets a valid +message ID as response, even though the message will not be delivered to the client app. +Eventually, the registration ID will be removed and the server will get a +<code>NotRegistered</code> error, without any further action being required from +the 3rd-party server (this scenario happens frequently while an app is +being developed and tested).</p> diff --git a/docs/html/google/gcm/gs.jd b/docs/html/google/gcm/gs.jd index a88962462cfc..2331292614ec 100644 --- a/docs/html/google/gcm/gs.jd +++ b/docs/html/google/gcm/gs.jd @@ -1,4 +1,4 @@ -page.title=Getting Started +page.title=Getting Started on Android  page.tags=cloud,push,messaging  @jd:body @@ -46,7 +46,7 @@ project number. For example, <strong>Project Number: 670330094152</strong>.</p><    <li>Copy down your project number. You will use it later on as the    <a href="{@docRoot}google/gcm/gcm.html#senderid">GCM sender ID</a>.</li> -   +  </ol>  <h2 id="gcm-service">Enabling the GCM Service</h2>  <p>To enable the GCM service:</p> @@ -71,7 +71,7 @@ purposes, you can use {@code 0.0.0.0/0}.</p></li>  <li>In the refreshed page, copy the  <a href="{@docRoot}google/gcm/gcm.html#apikey">API key</a>. -You will need the API key later on to perform authentication in your application server.</li> +You will need the API key later on to perform authentication in your app server.</li>  <p class="note"><strong>Note:</strong> If you need to rotate the key, click  <strong>Regenerate key</strong>. A new key  will be created. If you think the key has been @@ -84,16 +84,11 @@ compromised and you want to delete it immediately, click <strong>Delete</strong>  implementing GCM. Here is an overview of the basic steps:</p>  <ol> -  <li>Decide which Google-provided GCM connection server you want to use— -  <a href="http.html">HTTP</a> or <a href="ccs.html">XMPP</a> (CCS). GCM connection servers -take messages from a 3rd-party application -server (written by you) and send them to a GCM-enabled Android application (the -"client app," also written by you) running on a device. </li> -  <li>Implement an application server (the "3rd-party application server") to interact +  <li>Implement an app server (the "3rd-party app server") to interact  with your chosen GCM connection server. The app server sends data to a -GCM-enabled Android client application via the GCM connection server. For more +GCM-enabled Android client app via the GCM connection server. For more  information about implementing the server side, see <a href="server.html">  Implementing GCM Server</a>.</li> -<li>Write your client app. This is the GCM-enabled Android application that runs +<li>Write your client app. This is the GCM-enabled Android app that runs  on a device. See <a href="client.html">Implementing GCM Client</a> for more information.</li>  </ol> diff --git a/docs/html/google/gcm/http.jd b/docs/html/google/gcm/http.jd index 773acd1690ff..5022e0915f5d 100644 --- a/docs/html/google/gcm/http.jd +++ b/docs/html/google/gcm/http.jd @@ -23,6 +23,7 @@ page.title=GCM HTTP Connection Server  <h2>See Also</h2>  <ol class="toc"> +<li><a href="server-ref.html">Server Reference</a></li>  <li><a href="gs.html">Getting Started</a></li>  <li><a href="client.html">Implementing GCM Client</a></li>  <li><a href="ccs.html">Cloud Connection Server</a></li> @@ -42,26 +43,30 @@ application server and sending them to the device.</p>  applies to <a href="http://developer.chrome.com/apps/cloudMessaging">  GCM with Chrome apps</a> as well as Android.</p> -<p>See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the message +<p>See the +<a href="server-ref.html">Server Reference</a> for a list of all the message  parameters and which connection server(s) supports them.</p>  <h2 id="auth">Authentication</h2> -<p>To send a  message, the application server issues a POST request to -<code>https://android.googleapis.com/gcm/send</code>.</p> +<p>To send a  message, the application server issues a POST request. For example:</p> +<pre>https://android.googleapis.com/gcm/send</pre>  <p>A  message request is made of 2 parts: HTTP header and HTTP body.</p>  <p>The HTTP header must contain the following headers:</p>  <ul>    <li><code>Authorization</code>: key=YOUR_API_KEY</li> -  <li><code>Content-Type</code>: <code>application/json</code> for JSON; <code>application/x-www-form-urlencoded;charset=UTF-8</code> for plain text. +  <li><code>Content-Type</code>: <code>application/json</code> for JSON; +<code>application/x-www-form-urlencoded;charset=UTF-8</code> for plain text. +If <code>Content-Type</code> is omitted, the format +is assumed to be plain text.    </li>  </ul>  <p>For example:  </p> +  <pre>Content-Type:application/json  Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA @@ -71,26 +76,30 @@ Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA      ...    },  }</pre> -<p class="note"> -  <p><strong>Note:</strong> If <code>Content-Type</code> is omitted, the format -is assumed to be plain text.</p> -</p> +  <p>The HTTP body content depends on whether you're using JSON or plain text.  See -<a href="server.html#params">Implementing GCM Server</a> for a list of all the +<a href="server-ref.html#params">the Server Reference</a> for a list of all the  parameters your JSON or plain text message can contain.</p>    <h2 id="request">Request Format</h2> + +<p>This section shows you how to format a request for both JSON and plain text. See +the <a href="server-ref.html#table1">Server Reference</a> for a complete +list of the fields you can include in a request.</p> +    <p>Here is the smallest possible request (a message without any parameters and  just one recipient) using JSON:</p> +    <pre class="prettyprint pretty-json">{ "registration_ids": [ "42" ] }</pre>    <p>And here the same example using plain text:</p>    <pre class="prettyprint">registration_id=42</pre>    <p> Here is a message with a payload and 6 recipients:</p> +    <pre class="prettyprint pretty-HTML">{ "data": {      "score": "5x1",      "time": "15:10" @@ -112,10 +121,25 @@ just one recipient) using JSON:</p>    <pre class="prettyprint">collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42    </pre> +<p>Here is a message that includes a notification key and payload:</p> + +<pre> +{ +  "data": { +    "message": "ciao" +  }, +  "notification_key":"aUniqueKey" +} +</pre> + +<p>For more information about notifications and how to use them, see +<a href="{@docRoot}google/gcm/notifications.html">User Notifications</a>.</p> + +  <p class="note"><strong>Note:</strong> If your organization has a firewall  that restricts the traffic to or  from the Internet, you need to configure it to allow connectivity with GCM in order for -your Android devices to receive messages. +your GCM client apps to receive messages.  The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but  it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should allow  your firewall to accept outgoing connections to all IP addresses @@ -127,54 +151,12 @@ contained in the IP blocks listed in Google's ASN of 15169.</p>  <p>There are two possible outcomes when trying to send a message:</p>  <ul> -  <li>The message is processed successfully.</li> -  <li>The GCM server rejects the request.</li> +  <li>The message is processed successfully. The HTTP response has a 200 status, and +the body contains more information about the status of the message (including possible errors).</li> +  <li>The GCM server rejects the request. The HTTP response contains a +non-200 status code (such as 400, 401 or 5xx).</li>  </ul> -<p>When the message is processed successfully, the HTTP response has a 200 status -and the body contains more information about the status of the message -(including possible errors). When the request is rejected, -the HTTP response contains a non-200 status code (such as 400, 401, or 503).</p> - -<p>The following table summarizes the statuses that the HTTP response header might -contain. Click the troubleshoot link for advice on how to deal with each type of -error.</p> -<table border=1> -  <tr> -    <th>Response</th> -    <th>Description</th> -  </tr> -  <tr> -    <td>200</td> -    <td>Message was processed successfully. The response body will contain more -details about the message status, but its format will depend whether the request -was JSON or plain text. See <a href="#success">Interpreting a success response</a> -for more details.</td> -  </tr> -  <tr> -    <td>400</td> -    <td><span id="internal-source-marker_0.2">Only applies for JSON requests. -Indicates that the request could not be parsed as JSON, or it contained invalid -fields (for instance, passing a string where a number was expected). The exact -failure reason is described in the response and the problem should be addressed -before the request can be retried.</td> -  </tr> -  <tr> -    <td>401</td> -    <td>There was an error authenticating the sender account. -<a href="#auth_error">Troubleshoot</a></td> -  </tr> -  <tr> -    <td>5xx</td> -    <td>Errors in the 500-599 range (such as 500 or 503) indicate that there was -an internal error in the GCM server while trying to process the request, or that -the server is temporarily unavailable (for example, because of timeouts). Sender -must retry later, honoring any <code>Retry-After</code> header included in the -response. Application servers must implement exponential back-off. -<a href="#internal_error">Troubleshoot</a></td> -  </tr> -</table> -  <h3 id="success">Interpreting a success response</h3>  <p>When a JSON request is successful (HTTP status code 200), the response body  contains a JSON object with the following fields:</p> @@ -241,8 +223,8 @@ code>registration_ids</code> passed in the request (using the same index).</li>  request.</li>        <li>If it is <code>NotRegistered</code>, you should remove the registration  ID from your server database because the application was uninstalled from the -device or it does not have a broadcast receiver configured to receive -<code>com.google.android.c2dm.intent.RECEIVE</code> intents.</li> +device, or the client app isn't configured to receive +messages.</li>        <li>Otherwise, there is something wrong in the registration ID passed in  the request; it is probably a non-recoverable error that will also require removing  the registration from the server database. See <a href="#error_codes">Interpreting @@ -291,8 +273,7 @@ might occur when trying to send a message to a device:</p>  <dt id="invalid_reg"><strong>Invalid Registration ID</strong></dt>  <dd>Check the formatting of the registration ID that you pass to the server. Make -sure it matches the registration ID the phone receives in the -<code>com.google.android.c2dm.intent.REGISTRATION</code> intent and that you're +sure it matches the registration ID the client app receives and that you're  not truncating it or adding additional characters.  <br/>Happens when error code is <code>InvalidRegistration</code>.</dd> @@ -306,17 +287,13 @@ Happens when error code is <code>MismatchSenderId</code>.</dd>  <dt id="unreg_device"><strong>Unregistered Device</strong></dt>  <dd>An existing registration ID may cease to be valid in a number of scenarios, including:  <ul> -  <li>If the application manually unregisters by issuing a -<span class="prettyprint pretty-java"> -<code>com.google.android.c2dm.intent.UNREGISTER</code></span><code> -</code>intent.</li> +  <li>If the application manually unregisters.</li>    <li>If the application is automatically unregistered, which can happen  (but is not guaranteed) if the user uninstalls the application.</li>    <li>If the registration ID expires. Google might decide to refresh registration  IDs. </li> -  <li>If the application is updated but the new version does not have a broadcast -receiver configured to receive <code>com.google.android.c2dm.intent.RECEIVE</code> -intents.</li> +  <li>If the application is updated but the new version is not configured to receive +messages.</li>  </ul>  For all these cases, you should remove this registration ID from the 3rd-party  server and stop using it to send @@ -331,8 +308,7 @@ as the values.  <dt id="invalid_datakey"><strong>Invalid Data Key</strong></dt>  <dd>The payload data contains a key (such as <code>from</code> or any value -prefixed by <code>google.</code>) that is used internally by GCM in the -<code>com.google.android.c2dm.intent.RECEIVE</code> Intent and cannot be used. +prefixed by <code>google.</code>) that is used internally by GCM and therefore cannot be used.  Note that some words (such as <code>collapse_key</code>) are also used by GCM  but are allowed in the payload, in which case the payload value will be  overridden by the GCM value. @@ -354,9 +330,9 @@ authenticated. Possible causes are: <ul>  <li>Request originated from a server not whitelisted in the Server Key IPs.</li>  </ul> -Check that the token you're sending inside the <code>Authorization</code> header -is the correct API key associated with your project. You can check the validity -of your API key by running the following command:<br/> +When there is an Authentication Error, you can check the validity of your API key by running You can check the validity +of your API key by running the following command (this example shows what you +would do on Android; see the documentation for your platform):<br/>  <pre># api_key=YOUR_API_KEY @@ -405,8 +381,7 @@ Happens when the HTTP status code is between 501 and 599, or when the  <dd>  The server encountered an error while trying to process the request. You  could retry the same request (obeying the requirements listed in the <a href="#timeout">Timeout</a> -section), but if the error persists, please report the problem in the -<a href="https://groups.google.com/forum/?fromgroups#!forum/android-gcm">android-gcm group</a>. +section), but if the error persists, please report the problem to Google.  <br />  Happens when the HTTP status code is 500, or when the <code>error</code> field of a JSON  object in the results array is <code>InternalServerError</code>. @@ -488,7 +463,7 @@ registration_id=32  <p>This section gives examples of implementing an app server that works with the  GCM HTTP connection server. Note that a full GCM implementation requires a -client-side implementation, in addition to the server.</a> +client-side implementation, in addition to the server. This example is based on Android.</a>  <p>Requirements</p> @@ -508,7 +483,7 @@ version 1.6 or later.</li>  </ul>  <p>For the Android application:</p>  <ul> -  <li>Emulator (or device) running Android 2.2 with Google APIs.</li> +  <li>Emulator (or device) running Android 2.2 (ideally, 2.3 or above) with Google APIs.</li>    <li>The Google API project number of the account registered to use GCM.</li>  </ul> diff --git a/docs/html/google/gcm/notifications.jd b/docs/html/google/gcm/notifications.jd index 147b69c3b57c..333d4b694d9c 100644 --- a/docs/html/google/gcm/notifications.jd +++ b/docs/html/google/gcm/notifications.jd @@ -306,9 +306,3 @@ receive the message:</p>  <p>In the case of failure, the response has HTTP code 503 and no JSON. When a message  fails to be delivered to one or more of the regIDs associated with a {@code notification_key},  the 3rd-party server should retry.</p> - - - - - - diff --git a/docs/html/google/gcm/server-ref.jd b/docs/html/google/gcm/server-ref.jd new file mode 100644 index 000000000000..a94e72768bc5 --- /dev/null +++ b/docs/html/google/gcm/server-ref.jd @@ -0,0 +1,763 @@ +page.title=Server Reference +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>In this document</h2> + +<ol class="toc"> +  <li><a href="#downstream">Downstream Messages</a></li> +<ol class="toc"> +      <li><a href="#send-downstream">Sending a downstream message</a></li> +      <li><a href="#interpret-downstream">Interpreting a downstream message response</a></li> +    </ol> +  <li><a href="#upstream">Upstream Messages (XMPP)</a> +    <ol class="toc"> +      <li><a href="#interpret-upstream">Interpreting an upstream XMPP message</a></li> +      <li><a href="#upstream-response">Sending an upstream XMPP message response</a></li> +    </ol> +  </li> +<li><a href="#ccs">Cloud Connection Server Messages (XMPP)</a></li> +<li><a href="#error-codes">Downstream message error response codes (HTTP and XMPP)</a></li> +</ol> + +</div> +</div> + +<p>This document provides a reference for the syntax used to pass +messages back and forth in GCM. These messages fall into +the following broad categories:</p> + +<ul> +   <li><a href="#downstream">Downstream messages</a></li> +   <li><a href="#upstream">Upstream messages</a></li> +   <li><a href="#ccs">Cloud Connection Server messages (XMPP)</a></li> +   <li><a href="#error-codes">Downstream message error response codes (HTTP and XMPP)</a></li> +</ul> + +<p>The following sections describe the basic requirements for +sending messages.</p> + +<h2 id="downstream">Downstream Messages</h2> +<p>This is the message that a 3rd-party app server sends to a client app. +</p> +<p>A downstream message includes the following components:</p> +<ul> +  <li>Target: specifies the recipient of the message.</li> +  <li>Options: specifies attributes of the message.</li> +  <li>Payload: specifies additional content to be included in the message. Optional.</li> +</ul> + +<p>The syntax for each of these components is described in the tables below. </p> + +<h3 id="send-downstream">Sending a downstream message</h3> + +<p>This section gives the syntax for sending a downstream messages. For JSON, +these messages can be either HTTP or XMPP. For plain text, these messages can only be HTTP.</p> + +<h4>Downstream HTTP or XMPP messages (JSON)</h4> + +<p>The following table lists the targets, options, and payload for HTTP or XMPP JSON messages.</p> +<p class="table-caption" id="table1"> +  <strong>Table 1.</strong> Targets, options, and payload for downstream HTTP or XMPP message (JSON).</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Protocol</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +<tr> +    <td colspan="4"><strong>Targets</strong></td> +  </tr> +  <tr> +    <td><code>to</code></td> +    <td>XMPP</td> +    <td>Required, string</td> +    <td><p>This parameter specifies the recipient of a message. </p> +      <p>The value must be a registration ID or notification key.</p> +    <p>This parameter is used in XMPP in place of {@code registration_ids} or   {@code notification_key} in HTTP.</p></td> +  </tr> +  <tr> +    <td><code>registration_ids</code></td> +    <td>HTTP</td> +    <td>Required if {@code notification_key} not present, string array</td> +    <td><p>This parameter specifies the list of devices (registration IDs) +receiving the message. It must contain at least 1 and at most 1000 registration IDs.</p> +      <p>Multicast messages (sending to more than 1 registration IDs) are allowed using HTTP JSON format only.</p> +    <p>This parameter or {@code notification_key} is used in HTTP in place of {@code to} in XMPP.</p></td> +  </tr> +  <tr> +    <td><code>notification_key</code></td> +    <td>HTTP</td> +    <td>Required if {@code registration_ids} not present, string</td> +    <td><p>This parameter specifies the mapping of a single user to +multiple registration IDs associated with that user.</p> +      <p>This allows a 3rd-party app server to send a single message to multiple app instances +(typically on multiple devices) owned by a single user.</p> +      <p>A 3rd-party app server can use {@code notification_key} as the target for a +message instead of an individual registration ID (or array of registration IDs). +The maximum number of members allowed for a {@code notification_key} is 20.</p> +      <p>This parameter or {@code registration_ids} is used in HTTP in place of {@code to} in XMPP.</p> +    <p>See <a href="notifications.html">User Notifications</a> for details.</p></td> +  </tr> +<tr> +    <td colspan="4"><strong>Options</strong></td> +  </tr> +  <tr> +    <td><code>message_id</code></td> +    <td>XMPP</td> +    <td>Required, string</td> +    <td><p>This parameter uniquely identifies a message in an XMPP connection.</p></td> +  </tr> +  <tr> +    <td><code>collapse_key</code></td> +    <td>HTTP, XMPP</td> +    <td>Optional, string</td> +    <td><p>This parameters identifies a group of messages (e.g., with +{@code collapse_key: "Updates Available"}) that can be collapsed, so that only the +last message gets sent when delivery can be resumed. This is intended to avoid sending too +many of the same messages when the device comes back online or becomes active (see {@code delay_while_idle}).</p> +      <p>Note that there is no guarantee of the order in which messages get sent.</p> +      <p>Messages with collapse key are also called +<a href="{@docRoot}google/gcm/server.html#s2s">send-to-sync messages</a> messages. +</p> +    <p>Note: A maximum of 4 different collapse keys is allowed at any given time. This means a +GCM connection server can simultaneously store 4 different send-to-sync messages per client app. If you +exceed this number, there is no guarantee which 4 collapse keys the GCM connection server will keep. </p></td> +  </tr> +  <tr> +    <td><code>delay_while_idle</code></td> +    <td>HTTP, XMPP</td> +    <td>Optional, JSON boolean</td> +    <td>When this parameter is set to {@code true}, it indicates that the message should not be +sent until the device becomes active.</p> +    <p>The default value is {@code false}.</p></td> +  </tr> +  <tr> +    <td><code>time_to_live</code></td> +    <td>HTTP, XMPP</td> +    <td>Optional, JSON number</td> +    <td><p>This parameter specifies how long (in seconds) the message should be kept in GCM storage +if the device is offline. The maximum time to live supported is 4 weeks.</p> +    <p>The default value is 4 weeks. </p></td> +  </tr> +  <tr> +    <td><code>delivery_receipt_ +<br>requested</code></td> +    <td>XMPP</td> +    <td>Optional, JSON boolean</td> +    <td><p>This parameter lets 3rd-party app server request confirmation of message delivery.</p> +      <p>When this parameter is set to {@code true}, CCS sends a delivery receipt +when the device confirms that it received the message.</p> +    <p>The default value is {@code false}.</p></td> +  </tr> +  <tr> +    <td><code>restricted_package_ +<br>name</code></td> +    <td>HTTP</td> +    <td>Optional, string</td> +    <td>This parameter specifies the package name of the application where the +registration IDs must match in order to receive the message.</td> +  </tr> +  <tr> +    <td><code>dry_run</code></td> +    <td>HTTP</td> +    <td>Optional, JSON boolean</td> +    <td><p>This parameter, when set to {@code true}, allows developers to test a +request without actually sending a message.</p> +    <p>The default value is {@code false}.</p></td> +  </tr> +<tr> +    <td colspan="4"><strong>Payload</strong></td> +  </tr> +  <tr> +    <td><code>data</code></td> +    <td>HTTP, XMPP</td> +    <td>Optional, JSON object</td> +    <td><p>This parameter specifies the key-value pairs of the message's payload. There is +no limit on the number of key-value pairs, but there is a total message size limit of 4kb.</p> +      <p>For instance, in Android, <code>data:{"score":"3x1"}</code> would result in an intent extra +named {@code score} with the string value {@code 3x1}.</p> +      <p>The key should not be a reserved word ({@code from} or any word starting with +{@code google}). It is also not recommended to use words defined in this table +(such as {@code collapse_key}) because that could yield unpredictable outcomes. </p> +    <p>Values in string types are recommended. You have to convert values in objects +or other non-string data types (e.g., integers or booleans) to string.</p></td> +  </tr> +</table> + +<h3>Downstream HTTP messages (Plain Text)</h3> + +<p>The following table lists the syntax for targets, options, and payload in plain +text downstream HTTP messages.</p> + +<p class="table-caption" id="table2"> +  <strong>Table 2.</strong> Targets, options, and payload for downstream plain text HTTP messages.</p> + +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +<tr> +    <td colspan="3"><strong>Targets</strong></td> +  </tr> +  <tr> +    <td><code>registration _id</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies the client apps (registration ID) receiving the message.</p> +    <p>Multicast messaging (sending to more than one registration ID) is allowed using HTTP JSON format only.</p></td> +  </tr> +<tr> +    <td colspan="3"><strong>Options</strong></td> +  </tr> +  <tr> +    <td><code>collapse_key</code></td> +    <td>Optional, string</td> +    <td>See <a href="#table1">table 1</a> for details.</td> +  </tr> +  <tr> +    <td><code>delay_while_idle</code></td> +    <td>Optional, boolean or number</td> +    <td>See <a href="#table1">table 1</a> for details.</td> +  </tr> +  <tr> +    <td><code>time_to_live</code></td> +    <td>Optional, number</td> +    <td>See <a href="#table1">table 1</a> for details.</td> +  </tr> +  <tr> +    <td><code>restricted_package_name</code></td> +    <td>Optional, string</td> +    <td>See <a href="#table1">table 1</a> for details.</td> +  </tr> +  <tr> +    <td><code>dry_run </code></td> +    <td>Optional, boolean</td> +    <td>See <a href="#table1">table 1</a> for details.</td> +  </tr> +<tr> +    <td colspan="3"><strong>Payload</strong></td> +  </tr> +  <tr> +    <td><code>data.<key></code></td> +    <td>Optional, string</td> +    <td><p>This parameter specifies the key-value pairs of the message's payload. +There is no limit on the number of key-value parameters, +but there is a total message size limit of 4kb.</p> +      <p>For instance, in Android, <code>data:{"score":"3x1"}</code> would result in an intent extra +named {@code score} with the string value {@code 3x1}.</p> +    <p>The key should not be a reserved word ({@code from} or any word starting with +{@code google}). It is also not recommended to use words defined in this table +(such as {@code collapse_key}) because that could yield unpredictable outcomes.</p></td> +  </tr> +</table> + +<h3 id="interpret-downstream">Interpreting a Downstream Message Response</h3> + +<p>This section describes the syntax of a response to a downstream message. A client +app or the GCM Connection Server sends the response to 3rd-party app server upon processing +the message request. </p> + +<h4>Interpreting a downstream HTTP message response </h4> +<p>The 3rd-party app server should look at both the message response header and the body +to interpret the message response sent from the GCM Connection Server. The following table +describes the possible responses.</p> +<p> + +<p class="table-caption" id="table3"> +  <strong>Table 3.</strong> Downstream HTTP message response header.</p> +<table border=1> +  <tr> +    <th>Response</th> +    <th>Description</th> +  </tr> +  <tr> +    <td>200</td> +    <td>Message was processed successfully. The response body will contain more +details about the message status, but its format will depend whether the request +was JSON or plain text. See <a href="#table4">table 4</a> +for more details.</td> +  </tr> +  <tr> +    <td>400</td> +    <td>Only applies for JSON requests. +Indicates that the request could not be parsed as JSON, or it contained invalid +fields (for instance, passing a string where a number was expected). The exact +failure reason is described in the response and the problem should be addressed +before the request can be retried.</td> +  </tr> +  <tr> +    <td>401</td> +    <td>There was an error authenticating the sender account. +<a href="server.html#auth_error">Troubleshoot</a></td> +  </tr> +  <tr> +    <td>5xx</td> +    <td>Errors in the 500-599 range (such as 500 or 503) indicate that there was +an internal error in the GCM server while trying to process the request, or that +the server is temporarily unavailable (for example, because of timeouts). Sender +must retry later, honoring any <code>Retry-After</code> header included in the +response. Application servers must implement exponential back-off. +<a href="server.html#internal_error">Troubleshoot</a></td> +  </tr> +</table> + +<p>The following table lists the fields in a downstream message response body +(JSON).</p> + + +<p class="table-caption" id="table4"> +  <strong>Table 4.</strong> Downstream HTTP message response body (JSON).</p> +<table> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td><code>multicast_id</code></td> +    <td>Required, number</td> +    <td>Unique ID (number) identifying the multicast message.</td> +  </tr> +  <tr> +    <td><code>success</code></td> +    <td>Required, number</td> +    <td>Number of messages that were processed without an error.</td> +  </tr> +  <tr> +    <td><code>failure</code></td> +    <td>Required, number</td> +    <td>Number of messages that could not be processed.</td> +  </tr> +  <tr> +    <td><code>canonical_ids</code></td> +    <td>Required, number</td> +    <td>Number of results that contain a canonical registration ID. See the +<a href="{@docRoot}google/gcm/gcm.html#canonical">Overview</a> for more discussion of this topic.</td> +  </tr> +  <tr> +    <td><code>results</code></td> +    <td>Optional, array object</td> +    <td>Array of objects representing the status of the messages processed. The +objects are listed in the same order as the request (i.e., for each registration +ID in the request, its result is listed in the same index in the response).<br> +      <ul> +        <li><code>message_id</code>: String specifying a unique ID for each successfully processed +          message.</li> +        <li><code>registration_id</code>: Optional string specifying the canonical registration ID +          for the client app that the message was processed and sent to. Sender should use this +          value as the Registration ID for future requests. Otherwise, the messages might +          be rejected. +        </li> +        <li><code>error</code>: String specifying the error that occurred when processing the +          message for the recipient. The possible values can be found in <a href="#table11">table 11 +        </a>.</li> +    </ul></td> +  </tr> +</table> + + +<p class="table-caption" id="table5"> +  <strong>Table 5.</strong> Success response for downstream HTTP message response body (Plain Text).</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td><code>id</code></td> +    <td>Required, string</td> +    <td>This parameter specifies the unique message ID that GCM server processed successfully.</td> +  </tr> +  <tr> +    <td><code>registration_id</code></td> +    <td>Optional, string</td> +    <td>This parameter specifies the canonical registration ID for the client app that the message was +processed and sent to. Sender should replace the registration ID with this value on future requests, +otherwise, the messages might be rejected.</td> +  </tr> +</table> + +<p class="table-caption" id="table6"> +  <strong>Table 6.</strong> Error response for downstream HTTP message response body (Plain Text).</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td>{@code Error}</td> +    <td>Required, string</td> +    <td>This parameter specifies the error value while processing the message for the recipient. +See <a href="#table11">table 11</a> for details. </td> +  </tr> +</table> + +<h4>Interpreting a downstream XMPP message response</h4> + +<p>The following table lists the fields that appear in a downstream XMPP message response.</p> + +<p class="table-caption" id="table7"> +  <strong>Table 7.</strong> Downstream message XMPP message response body.</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td><code>from</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies who sent this response.</p> +    <p>The value is the registration ID of the client app.</p></td> +  </tr> +  <tr> +    <td><code>message_id</code></td> +    <td>Required, string</td> +    <td>This parameter uniquely identifies a message in an XMPP connection. +The value is a string that uniquely identifies the associated message.</td> +  </tr> +  <tr> +    <td><code>message_type</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies an 'ack' or 'nack' message from XMPP (CCS) +to the 3rd-party app server.</p> +    <p>If the value is set to {@code nack}, the 3rd-party app server should look at +{@code error} and {@code error_description} to get failure information. </p></td> +  </tr> +  <tr> +    <td><code>error</code></td> +    <td>Optional, string</td> +    <td>This parameter specifies an error related to the downstream message. It is set when the +{@code message_type} is {@code nack}. See <a href="#table11">table 6</a> for details.</td> +  </tr> +  <tr> +    <td><code>error_description</code></td> +    <td>Optional, string</td> +    <td>This parameter provides descriptive information for the error. It is set +when the {@code message_type} is {@code nack}.</td> +  </tr> +</table> +<h2 id="upstream">Upstream Messages (XMPP)</h2> + +<p>An upstream message is a message the client app sends to the 3rd-party app server. +Currently only CCS (XMPP) supports upstream messaging.</p> + +<h3 id="interpret-upstream">Interpreting an upstream XMPP message </h3> +<p>The following table describes the fields that appear in an upstream XMPP message. + +<p class="table-caption" id="table8"> +  <strong>Table 8.</strong> Upstream XMPP messages.</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td><code>from</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies who sent the message.</p> +    <p>The value is the registration ID of the client app.</p></td> +  </tr> +  <tr> +    <td><code>category</code></td> +    <td>Required, string</td> +    <td>This parameter specifies the application package name of the client app that sent the message. </td> +  </tr> +  <tr> +    <td><code>message_id</code></td> +    <td>Required, string</td> +    <td>This parameter specifies the unique ID of the message. </td> +  </tr> +  <tr> +    <td><code>data</code></td> +    <td>Optional, string</td> +    <td>This parameter specifies the key-value pairs of the message's payload.</td> +  </tr> +</table> + +<h3 id="upstream-response">Sending an upstream XMPP message response</h3> + +<p>The following table describes the response that 3rd-party app server is expected to send to +<a href="{@docRoot}google/gcm/ccs.html">XMPP (CCS)</a> in response to an +upstream message it (the app server) received.</p> + +<p class="table-caption" id="table9"> +  <strong>Table 9.</strong> Upstream XMPP message response.</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td><code>to</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies the recipient of a response message. </p> +    <p>The value must be a registration ID of the client app that sent the upstream message.</p></td> +  </tr> +  <tr> +    <td><code>message_id</code></td> +    <td>Required, string</td> +    <td>This parameter specifies which message the response is intended for. The value must be +the {@code message_id} value from the corresponding upstream message.</td> +  </tr> +  <tr> +    <td><code>message_type</code></td> +    <td>Required, string</td> +    <td>This parameter specifies an {@code ack} message from a 3rd-party app server to CCS.</td> +  </tr> +</table> +<h2 id="ccs">Cloud Connection Server Messages (XMPP) </h2> +<p>This is a message sent from XMPP (CCS) to a 3rd-party app server. Here are the primary types +of messages that XMPP (CCS) sends to the 3rd-party app server:</p> +<ul> +  <li><strong>Delivery Receipt:</strong> If the 3rd-party app server included {@code delivery_receipt_requested} +in the downstream message, XMPP (CCS) sends a delivery receipt when it receives confirmation +that the device received the message.</li> +  <li><strong>Control:</strong> These CCS-generated messages indicate that +action is required from the 3rd-party app server.</li> +</ul> + +<p>The following table describes the fields included in the messages CCS +sends to a 3rd-party app server.</p> + +<p class="table-caption" id="table10"> +  <strong>Table 10.</strong> GCM Cloud Connection Server messages (XMPP).</p> +<table border="1"> +  <tr> +    <th>Parameter</th> +    <th>Usage</th> +    <th>Description</th> +  </tr> +  <tr> +    <td colspan="3"><strong>Common Field</strong></td> +  </tr> +  <tr> +    <td><code>message_type</code></td> +    <td>Required, string</td> +    <td><p>This parameter specifies the type of the CCS message: either delivery receipt or control.</p> +      <p>When it is set to {@code receipt}, the message includes {@code from}, {@code message_id}, +        {@code category} and {@code data} fields to provide additional information.</p> +    <p>When it is set to {@code control}, the message includes {@code control_type} to indicate the +type of control message.</p></td> +  </tr> +  <tr> +    <td colspan="3"><strong>Delivery receipt-specific</strong></td> +  </tr> +  <tr> +    <td><code>from</code></td> +    <td>Required, string</td> +    <td>This parameter is set to {@code gcm.googleapis.com}, indicating that the +message is sent from CCS.</td> +  </tr> +  <tr> +    <td><code>message_id</code></td> +    <td>Required, string</td> +    <td>This parameter specifies the original message ID that the receipt is intended for, +prefixed with {@code dr2:} to indicate that the message is a delivery receipt. A 3rd-party app +server must send an {@code ack} message with this message ID to acknowledge that it +received this delivery receipt. See <a href="#table9">table 9</a> for the 'ack' message format.</td> +  </tr> +  <tr> +    <td><code>category</code></td> +    <td>Optional, string</td> +    <td>This parameter specifies the application package name of the client app that +receives the message that this delivery receipt is reporting. This is available when +{@code message_type} is {@code receipt}.</td> +  </tr> +  <tr> +    <td><code>data</code></td> +    <td>Optional, string</td> +    <td>This parameter specifies the key-value pairs for the delivery receipt message. This is available +when the {@code message_type} is {@code receipt}. +      <ul> +        <li>{@code message_status}: This parameter specifies the status of the receipt message. +It is set to {@code MESSAGE_SENT_TO_DEVICE} to indicate the device has confirmed its receipt of +the original message.</li> +      <li>{@code original_message_id}: This parameter specifies the ID of the original message +that the 3rd-party app server sent to the client app.</li> +     <li>{@code device_registration_id}: This parameter specifies the registration ID of the +client app to which the original message was sent.</li> +    </ul> +</td> +  </tr> +  <tr> +    <td colspan="3"><strong>Control-specific</strong></td> +  </tr> +  <tr> +    <td><code>control_type</code></td> +    <td>Optional, string</td> +    <td><p>This parameter specifies the type of control message sent from CCS.</p> +    <p>Currently, only {@code CONNECTION_DRAINING} is supported. XMPP (CCS) sends this control message +before it closes a connection to perform load balancing. As the connection drains, no more messages +are allowed to be sent to the connection, but existing messages in the pipeline will +continue to be processed.</p></td> +  </tr> +</table> + +<h2 id="error-codes">Downstream message error response codes (HTTP and XMPP)</h2> + +<p>The following table lists the error response codes for downstream messages (HTTP and XMPP).</p> + +<p class="table-caption" id="table11"> +  <strong>Table 11.</strong> Downstream message error response codes.</p> +<table border="1"> +  <tr> +    <th>Error</th> +    <th>HTTP Code</th> +    <th>XMPP Code</th> +    <th>Recommended Action</th> +  </tr> +  <tr> +    <td>Missing Registration ID</td> +    <td>200 + error:MissingRegistration</td> +    <td><code>INVALID_JSON</code></td> +    <td>Check that the request contains a registration ID (either in the +{@code registration_id} in a plain text message, or in the {@code registration_ids} in JSON).</td> +  </tr> +  <tr> +    <td>Invalid Registration ID</td> +    <td>200 + error:InvalidRegistration</td> +    <td><code>BAD_REGISTRATION</code></td> +    <td>Check the format of the registration ID you pass to the server. Make sure it +matches the registration ID the client app receives from registering with GCM. Do not +truncate or add additional characters.</td> +  </tr> +  <tr> +    <td>Unregistered Device</td> +    <td>200 + error:NotRegistered</td> +    <td><code>DEVICE_UNREGISTERED</code></td> +    <td>An existing registration ID may cease to be valid in a number of scenarios, including:<br> +     <ul> +      <li>If the client app unregisters with GCM.</li> +      <li>If the client app is automatically unregistered, which can happen if the user uninstalls the application.</li> +      <li>If the registration ID expires (for example, Google might decide to refresh registration IDs).</li> +      <li>If the client app is updated but the new version is not configured to receive messages.</li> +</ul> + For all these cases, remove this registration ID from the 3rd-party app +server and stop using it to send messages.</td> +  </tr> +  <tr> +    <td>Invalid Package Name</td> +    <td>200 + error:InvalidPackageName</td> +    <td></td> +    <td>Make sure the message was addressed to a registration ID whose package name +matches the value passed in the request.</td> +  </tr> +  <tr> +    <td>Authentication Error</td> +    <td>401</td> +    <td> </td> +    <td>The sender account used to send a message couldn't be authenticated. Possible causes are:<br> +<ul> +      <li>Authorization header missing or with invalid syntax in HTTP request.</li> +      <li>Invalid project number sent as key.</li> +      <li>Key valid but with GCM service disabled.</li> +      <li>Request originated from a server not whitelisted in the Server Key IPs.</li> +</ul> +    Check that the token you're sending inside the Authentication header is +the correct API key associated with your project. See +<a href="{@docRoot}google/gcm/http.html">GCM HTTP Connection Server</a> for details.</td> +  </tr> +  <tr> +    <td>Mismatched Sender</td> +    <td>200 + error:MismatchSenderId</td> +    <td><code>BAD_REGISTRATION</code></td> +    <td>A registration ID is tied to a certain group of senders. When a client app registers +for GCM, it must specify which senders are allowed to send messages. You should use one +of those sender IDs when sending messages to the client app. If you switch to a different +sender, the existing registration IDs won't work.</td> +  </tr> +  <tr> +    <td>Invalid JSON</td> +    <td>400</td> +    <td><code>INVALID_JSON</code></td> +    <td>Check that the JSON message is properly formatted and contains valid fields +(for instance, making sure the right data type is passed in).</td> +  </tr> +  <tr> +    <td>Message Too Big</td> +    <td>200 + error:MessageTooBig</td> +    <td><code>INVALID_JSON</code></td> +    <td>Check that the total size of the payload data included in a message does +not exceed 4096 bytes. This includes both the the keys and the values.</td> +  </tr> +  <tr> +    <td>Invalid Data Key</td> +    <td>200 + error: +<br /> +InvalidDataKey</td> +    <td><code>INVALID_JSON</code></td> +    <td>Check that the payload data does not contain a key (such as {@code from} or any value +prefixed by {@code google}) that is used internally by GCM. Note that some words (such as {@code collapse_key}) +are also used by GCM but are allowed in the payload, in which case the payload value +will be overridden by the GCM value.</td> +  </tr> +  <tr> +    <td>Invalid Time to Live</td> +    <td>200 + error:InvalidTtl</td> +    <td><code>INVALID_JSON</code></td> +    <td>Check that the value used in {@code time_to_live} is an integer representing a +duration in seconds between 0 and 2,419,200 (4 weeks).</td> +  </tr> +  <tr> +    <td>Bad ACK message</td> +    <td>N/A</td> +    <td><code>BAD_ACK</code></td> +    <td>Check that the 'ack' message is properly formatted before retrying. See +<a href="#table9">table 9</a> for details.</td> +  </tr> +  <tr> +    <td>Timeout</td> +    <td>5xx or 200 + error:Unavailable</td> +    <td><code>SERVICE_UNAVAILABLE</code></td> +    <td><p>The server couldn't process the request in time. Retry the same request, but you must:<br> +<ul> +      <li>For HTTP: Honor the {@code Retry-After} header if it is included in the response from the +GCM Connection Server.</li> +      <li>Implement exponential back-off in your retry mechanism. (e.g. if you waited one second +before the first retry, wait at least two second before the next one, then 4 seconds and so on). +If you're sending multiple messages, delay each one independently by an additional random amount +to avoid issuing a new request for all messages at the same time.</li> +    <li>For CCS: The initial retry delay should be set to 1 second.</li> +</ul> +    <p>Senders that cause problems risk being blacklisted.</p></td> +  </tr> +  <tr> +    <td>Internal Server Error</td> +    <td>500 or 200 + error:InternalServerError</td> +    <td><code>INTERNAL_SERVER_ +<br /> +ERROR</code></td> +    <td>The server encountered an error while trying to process the request. You could retry +the same request following the requirements listed in "Timeout" (see row above). If the error persists, please +report the problem in the {@code android-gcm group}.</td> +  </tr> +  <tr> +    <td>Device Message Rate Exceeded</td> +    <td>200 + error: +<br />DeviceMessageRate +<br /> +Exceeded</td> +    <td><code>DEVICE_MESSAGE_RATE<br /> +_EXCEEDED</code></td> +    <td>The rate of messages to a particular device is too high. Reduce the +number of messages sent to this device and do not immediately retry sending to this device.</td> +  </tr> +  <tr> +    <td>Connection Draining</td> +    <td>N/A</td> +    <td><code>CONNECTION_DRAINING</code></td> +    <td>The message couldn't be processed because the connection is draining. This happens because +periodically, XMPP (CCS) needs to close down a connection to perform load balancing. Retry the message over +another XMPP connection.</td> +  </tr> +</table> diff --git a/docs/html/google/gcm/server.jd b/docs/html/google/gcm/server.jd index 20e2b2e6cf12..004fd0e42307 100644 --- a/docs/html/google/gcm/server.jd +++ b/docs/html/google/gcm/server.jd @@ -7,9 +7,9 @@ page.title=Implementing GCM Server  <h2>In this document</h2>  <ol class="toc"> -  <li><a href="#choose">Choosing a GCM Connection Server</a></li>    <li><a href="#role">Role of the 3rd-party Application Server</a></li> -    <li><a href="#send-msg">Sending Messages</a> +  <li><a href="#choose">Choosing a GCM Connection Server</a></li> +  <li><a href="#send-msg">Sending Messages</a>      <ol class="toc">        <li><a href="#target">Target</a></li> @@ -17,7 +17,18 @@ page.title=Implementing GCM Server        <li><a href="#params">Message parameters</a>      </ol>      </li> -  <li><a href="#receive">Receiving Messages</a> </li> +  <li><a href="#adv">Messaging Concepts and Best Practices</a> + +   <ol class="toc"> + +      <li><a href="#collapsible">Send-to-Sync vs. Messages with Payload</a></li> +      <li><a href="#ttl">Setting an Expiration Date for a Message</a></li> +      <li><a href="#multi-senders">Receiving Messages from Multiple Senders</a> +      <li><a href="#lifetime">Lifetime of a Message</a> +      <li><a href="#throttling">Throttling</a> +    </ol> + +</li>    </li>  </ol> @@ -25,6 +36,7 @@ page.title=Implementing GCM Server  <h2>See Also</h2>  <ol class="toc"> +<li><a href="server-ref.html">Server Reference</a></li>  <li><a href="gs.html">Getting Started</a></li>  <li><a href="client.html">Implementing GCM Client</a></li>  <li><a href="ccs.html">Cloud Connection Server (XMPP)</a></li> @@ -37,388 +49,392 @@ page.title=Implementing GCM Server  </div> -<p>The server side of Google Cloud Messaging (GCM) consists of 2 components:</p> +<p>The server side of Google Cloud Messaging (GCM) consists of two components:</p>  <ul>  <li>Google-provided <strong>GCM Connection Servers</strong> -take messages from a 3rd-party application server and send them to a GCM-enabled -Android application (the "client app") running on a device. For example, +take messages from a <a href="{@docRoot}google/gcm/server.html#role">3rd-party app server</a> +and send them to a GCM-enabled +application (the "client app") running on a device. For example,  Google provides connection servers for <a href="{@docRoot}google/gcm/http.html"> -HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">CCS</a> (XMPP).</li> +HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">XMPP (CCS)</a> (XMPP).</li>  <li>A <strong>3rd-party application server</strong> that you must implement. This application -server sends data to a GCM-enabled Android application via the chosen GCM connection server.</li> +server sends data to a GCM-enabled client app via the chosen GCM connection server.</li>  </ul>  </p> +<p>A full GCM implementation requires both a client implementation and a server +implementation. For more +information about implementing the client side, see <a href="client.html"> +Implementing GCM Client</a>.</p> + + +<h2 id="role">Role of the 3rd-party Application Server</h2> + +<p>Before you can write client apps that use the GCM feature, you must +have an  application server that meets the following criteria:</p> + +<ul> +  <li>Able to communicate with your client.</li> +  <li>Able to  fire off properly formatted requests to the GCM server.</li> +  <li>Able to handle requests and resend them as needed, using +<a href="http://en.wikipedia.org/wiki/Exponential_backoff">exponential back-off.</a></li> +  <li>Able to store the API key and client registration IDs. In HTTP, the API key is +included in the header of POST requests that send messages. In XMPP, the API key is +used in the SASL PLAIN authentication request as a password to authenticate the connection.</li> + <li>Able to generate message IDs to uniquely identify each message it sends. Message IDs +should be unique per sender ID.</li> +</ul> +  <p>Here are the basic steps you follow to implement your 3rd-party app server:</p>  <ul>        <li>Decide which GCM connection server(s) you want to use. Note that if you want to use -      upstream messaging from your client applications, you must use CCS. For a more detailed +      upstream messaging from your client applications, you must use XMPP (CCS). For a more detailed        discussion of this, see <a href="#choose">        Choosing a GCM Connection Server</a>.</li> -      <li>Decide how you want to implement your app server. For example: +      <li>Decide how you want to implement your app server. We provide helper libraries and code +samples to assist you with your 3rd-party app server implementation. For example:          <ul>            <li>If you decide to use the HTTP connection server, you can use the  GCM server helper library and demo app to help in implementing your app server.</li>            <li>If you decide to use the XMPP connection server, you can use  the provided Python or Java <a href="http://www.igniterealtime.org/projects/smack/">  Smack</a> demo apps as a starting point.</li> -        <li>Note that Google AppEngine does not support connections to CCS.</li> +        <li>Note that Google AppEngine does not support connections to XMPP (CCS).</li>          </ul>        </li>      </ul>    </li>  </ul> -<p>A full GCM implementation requires both a client implementation and a server -implementation. For more -information about implementing the client side, see <a href="client.html"> -Implementing GCM Client</a>.</p>  <h2 id="choose">Choosing a GCM Connection Server</h2>  <p>Currently GCM provides two connection servers: <a href="{@docRoot}google/gcm/http.html"> -HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">CCS</a> (XMPP). You can use them -separately or in tandem. CCS messaging differs from GCM HTTP messaging in the following ways:</p> +HTTP</a> and <a href="{@docRoot}google/gcm/ccs.html">XMPP (CCS)</a>. You can use them +separately or in tandem. XMPP (CCS) messaging differs from HTTP messaging in the following ways:</p>  <ul>    <li>Upstream/Downstream messages      <ul> -      <li>GCM HTTP: Downstream only: cloud-to-device. </li> -      <li>CCS: Upstream and downstream (device-to-cloud, cloud-to-device). </li> +      <li>HTTP: Downstream only, cloud-to-device up to 4KB of data. </li> +      <li>XMPP (CCS): Upstream and downstream (device-to-cloud, cloud-to-device), +        up to 4 KB of data. </li>      </ul>    </li> -  <li>Asynchronous messaging +  <li>Messaging (synchronous or asynchronous)      <ul> -      <li>GCM HTTP: 3rd-party app servers send messages as HTTP POST requests and -wait for a response. This mechanism is synchronous and causes the sender to block -before sending another message.</li> -      <li>CCS: 3rd-party app servers connect to Google infrastructure using a -persistent XMPP connection and send/receive messages to/from all their devices -at full line speed. CCS sends acknowledgment or failure notifications (in the +      <li>HTTP: Synchronous. 3rd-party app servers send messages as HTTP POST requests and +wait for a response. This mechanism is synchronous and blocks the sender from sending +another message until the response is received.</li> +      <li>XMPP (CCS): Asynchronous. 3rd-party app servers send/receive messages to/from all their +devices at full line speed over persistent XMPP connections. +XMPP (CCS) sends acknowledgment or failure notifications (in the  form of special ACK and NACK JSON-encoded XMPP messages) asynchronously.</li>      </ul>    </li>    <li>JSON      <ul> -      <li>GCM HTTP: JSON messages sent as HTTP POST.</li> -      <li>CCS: JSON messages encapsulated in XMPP messages.</li> +      <li>HTTP: JSON messages sent as HTTP POST.</li> +      <li>XMPP (CCS): JSON messages encapsulated in XMPP messages.</li> +    </ul> +  </li> +  <li>Plain Text +    <ul> +      <li>HTTP: Plain Text messages sent as HTTP POST.</li> +      <li>XMPP (CCS): Not supported.</li> +    </ul> +  </li> +  <li>Multicast downstream send to multiple registration IDs. +    <ul> +      <li>HTTP: Supported in JSON message format.</li> +      <li>XMPP (CCS): Not supported.</li>      </ul>    </li>  </ul> -<h2 id="role">Role of the 3rd-party Application Server</h2> -<p>Before you can write client Android applications that use the GCM feature, you must -have an  application server that meets the following criteria:</p> +<h2 id="send-msg">Sending Messages</h2> -<ul> -  <li>Able to communicate with your client.</li> -  <li>Able to  fire off properly formatted requests to the GCM server.</li> -  <li>Able to handle requests and resend them as needed, using -<a href="http://en.wikipedia.org/wiki/Exponential_backoff">exponential back-off.</a></li> -  <li>Able to store the API key and client registration IDs. The -API key is included in the header of POST requests that send -messages.</li> - <li>Able to generate message IDs to uniquely identify each message it sends. Message IDs -should be unique per sender ID.</li> -</ul> +<p>This section gives an overview of sending messages. For details of message syntax, +see <a href="{@docRoot}google/gcm/server-ref.html">Server Reference</a>.</p> -<h2 id="send-msg">Sending Messages</h2> +<h3>Overview</h3>  <p>Here is the general sequence of events that occurs when a 3rd-party application -server sends a message:</p> +server sends a message (the details vary depending on the platform):</p>  <ol> -  <li>The application server sends a message to GCM servers.</li> -  <li>Google enqueues and stores the message in case the device is offline.</li> -  <li>When the device is online, Google sends the message to the device.</li> -  <li>On the device, the system broadcasts the message to the specified Android -application via Intent broadcast with proper permissions, so that only the targeted -Android application gets the message. This wakes the Android application up. -The Android application does not need to be running beforehand to receive the message.</li> -  <li>The Android application processes the message. </li> +  <li>The 3rd-party app server sends a message to GCM servers.</li> +  <li>The GCM connection server enqueues and stores the message if the device is offline.</li> +  <li>When the device is online, GCM connection server sends the message to the device.</li> +  <li>The client app processes the message. </li>  </ol> -<p>The following sections describe the basic requirements for -sending messages.</p> +<h3>Implement send request</h3> + +<p>The following sections describe the basic components involved in +sending a request. See the <a href="{@docRoot}google/gcm/server-ref.html">Server Reference</a> +for details.</p> -<h3 id="target">Target</h3> +<h4 id="target">Target</h4>  <p>Required. When your app server sends a message in GCM, it must specify a target.</p> -<p>For HTTP you must specify the target as one of:</p> +<p>For HTTP you must specify the target as one of the following:</p>  <ul>  <li><code>registration_ids</code>: For sending to 1 or more devices (up to 1000).  When you send a message to multiple registration IDs, that is called a multicast message.</li>  <li><code>notification_key</code>: For sending to multiple devices owned by a single user.</li>  </ul> -<p>For CCS (XMPP):</p> +<p>For CCS (XMPP) you must specify the target as:</p>  <ul> -<li>You must specify the target as the "to" field, where the "to" +<li>{@code to}: This  field may contain a single registration ID or a notification key. -CCS does not support multicast messaging.</li> +XMPP (CCS) does not support multicast messaging.</li>  </ul> -<h3 id="payload">Payload</h3> -<p>Optional. If you are including a payload in the message, you use the <code>data</code> -parameter to include the payload. This applies for both HTTP and CCS.</p> - -<h3 id="params">Message parameters</h3> - -<p>The following table lists the parameters that a 3rd-party app server might -include in the JSON messages it sends to a connection server. See the "Where Supported" -column for information about which connection servers support that particular -parameter.</p> - -<p class="table-caption" id="table1"> -  <strong>Table 1.</strong> Message Parameters JSON (CCS and HTTP).</p> - -<table> -  <tr> -    <th>Parameter</th> -    <th>Description</th> -<th>Where Supported</th> -</tr> -  <td><code>to</code></td> -<td>In CCS, this parameter is used in place of <code>registration_ids</code> to -specify the recipient of a message. Its value must be a registration ID. -The value is a string. Required.</td> -<td>CCS</td> -</tr> -<tr> -<td><code>message_id</code></td> -<td>In CCS, this parameter uniquely identifies a message in an XMPP connection. -The value is a string that uniquely identifies the associated message. Required.</td> -<td>CCS</td> -</tr> -<tr> -<td><code>message_type</code></td> -<td>In CCS, this parameter indicates a special status message, typically sent by the system. -However, your app server also uses this parameter to send an 'ack' or 'nack' -message back to the CCS connection server. For more discussion of this topic, see -<a href="ccs.html">Cloud Connection Server</a>. The value is a string. Optional.</td> -<td>CCS</td> -<tr> -  <td><code>registration_ids</code></td> -  <td>This parameter specifies a string array containing the list of devices -(registration IDs) receiving the -message. It must contain at least 1 and at most 1000 registration IDs. To send a -multicast message, you must use JSON. For sending a single message to a single -device, you could use a JSON object with just 1 registration id, or plain text -(see below). A request must include a recipient—this can be either a -registration ID, an array of registration IDs, or a {@code notification_key}. -Required.</td> -<td>HTTP</td> -</tr> - <tr> -    <td><code>notification_key</code></td> -    <td>This parameter specifies a string that maps a single user to multiple -registration IDs associated -with that user. This allows a 3rd-party server to send a single message to -multiple app instances (typically on multiple devices) owned by a single user. -A 3rd-party server can use {@code notification_key} as the target for a message -instead of an individual registration ID (or array of registration IDs). The maximum -number of members allowed for a {@code notification_key} is 20. For more discussion -of this topic, see <a href="notifications.html">User Notifications</a>. Optional. -</td> -<td style="width:100px">HTTP. This feature is supported in CCS, but you use it by -specifying a notification key in the "to" field.</td> -</tr> -  <tr> -    <td><code>collapse_key</code></td> -    <td>This parameter specifies an arbitrary string (such as -"Updates Available") that is used -to collapse a group of like messages -when the device is offline, so that only the last message gets sent to the -client. This is intended to avoid sending too many messages to the phone when it -comes back online. Note that since there is no guarantee of the order in which -messages get sent, the "last" message may not actually be the last -message sent by the application server. Messages with collapse keys are also called -<a href="#s2s">send-to-sync messages</a>. -<br> -<strong>Note:</strong> GCM allows a maximum of 4 different collapse keys to be -used by the GCM server -at any given time. In other words, the GCM server can simultaneously store 4 -different send-to-sync messages per device, each with a different collapse key. -If you exceed -this number GCM will only keep 4 collapse keys, with no guarantees about which -ones they will be. See <a href="adv.html#collapsible">Advanced Topics</a> for more -discussion of this topic. Optional.</td> -<td>CCS, HTTP</td> -</tr> -  <tr> -    <td><code>data</code></td> -    <td>This parameter specifies a JSON object whose fields represents the -key-value pairs of the message's -payload data. If present, the payload data will be -included in the Intent as application data, with the key being the extra's name. -For instance, <code>"data":{"score":"3x1"}</code> would result in an intent extra -named <code>score</code> whose value is the string <code>3x1</code>. -There is no limit on the number of key/value pairs, though there is a limit on -the total size of the message (4kb). The values could be any JSON object, but we -recommend using strings, since the values will be converted to strings in the GCM -server anyway. If you want to include objects or other non-string data types -(such as integers or booleans), you have to do the conversion to string yourself. -Also note that the key cannot be a reserved word (<code>from</code> or any word -starting with <code>google.</code>). Using words defined in this table as field -names (such as <code>collapse_key</code>) could yield unpredictable outcomes and -is not recommended. Optional.</td> -<td>CCS, HTTP</td> -</tr> -  <tr> -    <td><code>delay_while_idle</code></td> -    <td>This parameter indicates that the message should not be sent immediately -if the device is idle. The server will wait for the device to become active, and -then only the last message for each <code>collapse_key</code> value will be -sent. The default value is <code>false</code>, and must be a JSON boolean. Optional.</td> -<td>CCS, HTTP</td> -</tr> -  <tr> -    <td><code>time_to_live</code></td> -    <td>This parameter specifies how long (in seconds) the message should be kept on GCM -storage if the device is offline. Optional (default time-to-live is 4 weeks, and must be set as -a JSON number).</td> -<td>CCS, HTTP</td> -</tr> -<tr> -  <td><code>restricted_package_name</code></td> -  <td>This parameter specifies a string containing the package -name of your application. When set, messages -are only sent to registration IDs that match the package name. Optional. -  </td> -<td>HTTP</td> -</tr> -<tr> -  <td><code>dry_run</code></td> -  <td>This parameter allows developers to test a request without actually -sending a message. Optional. The default value is <code>false</code>, and must -be a JSON boolean. -  </td> -<td>HTTP</td> -</tr> -<tr> -  <td><code>delivery_receipt_requested</code></td> -  <td>This parameter lets you request confirmation of message delivery. When -this parameter is set to <code>true</code>, CCS sends a -delivery receipt when a device confirms that it received a message sent by CCS. -The default value is <code>false</code>, and must be a JSON boolean. Optional.<br /> -This parameter relates to <a href="{@docRoot}google/gcm/ccs.html#receipts"}> -delivery receipts</a>. -</td> -  <td>CCS</td> -</tr> -<tr> -  <td><code>message_status</code></td> -  <td>This parameter specifies the status of the receipt message. -The parameter appears inside the -<code>"data"</code> field of a -delivery receipt message. Currently the only possible value -is <code>MESSAGE_SENT_TO_DEVICE</code>, which indicates that a device acknowledges -receiving  a message sent by CCS.<br /> -This parameter relates to <a href="{@docRoot}google/gcm/ccs.html#receipts"}> -delivery receipts</a>.</td> -  <td>CCS</td> -</tr> -<tr> -  <td><code>original_message_id</code></td> -  <td>The value of this parameter is the ID of the original message that the server sent to -the device. This parameter appears inside the <code>"data"</code> field of a -delivery receipt message. <br /> -This parameter relates to <a href="{@docRoot}google/gcm/ccs.html#receipts"}> -delivery receipts</a>.</td> -  <td>CCS</td> -</tr> -<tr> -  <td><code>device_registration_id</code></td> -  <td>For the purpose of tracking the delivery receipt, this parameter lists -the registration ID of the device to which a given message was sent. This parameter -appears inside the <code>"data"</code> field of a -delivery receipt message. <br /> -This parameter relates to <a href="{@docRoot}google/gcm/ccs.html#receipts"}> -delivery receipts</a>.</td> -  <td>CCS</td> -</tr> - -</table> +<h4 id="options">Options</h4> + +<p>There are various options the 3rd-party app server can set when sending a downstream +message to a client app. See the <a href="{@docRoot}google/gcm/server-ref.html#table1"> +Server Reference</a> for details. Here are a few examples of possible options:</p> + +<ul> +  <li>{@code collapse_key}: whether a message should be "send-to-sync" or a "message with +payload".</li> +  <li>{@code time_to_live}: setting an expiration date for a message.</li> +  <li>{@code dry_run}: Test your server.  <p>If you want to test your request (either JSON or plain text) without delivering -the message to the devices, you can set an optional HTTP or JSON parameter called +the message to the devices, you can set an optional HTTP parameter called  <code>dry_run</code> with the value <code>true</code>. The result will be almost  identical to running the request without this parameter, except that the message  will not be delivered to the devices. Consequently, the response will contain fake  IDs for the message and multicast parameters.</p> +</li> +</ul> -<p>If you are using plain text instead of JSON, the message parameters must be set as -HTTP parameters sent in the body, and their syntax is slightly different, as -described in the following table: - -<p class="table-caption" id="table2"> -  <strong>Table 2.</strong> Message Parameters Plain Text (HTTP only).</p> -<table> -  <tr> -    <th>Parameter</th> -    <th>Description</th> -  </tr> -  <tr> -    <td><code>registration_id</code></td> -    <td>This parameter specifies the registration ID of the single device -receiving the message. -Required.</td> -  </tr> -  <tr> -    <td><code>collapse_key</code></td> -    <td>Same as JSON (see previous table). Optional.</td> -  </tr> -  <tr> -    <td><code>data.<key></code></td> - -    <td>This parameter specifies payload data, expressed as parameters -prefixed with <code>data.</code> and -suffixed as the key. For instance, a parameter of <code>data.score=3x1</code> would -result in an intent extra named <code>score</code> whose value is the string -<code>3x1</code>. There is no limit on the number of key/value parameters, though -there is a limit on the total size of the  message. Also note that the key cannot -be a reserved word (<code>from</code> or any word starting with -<code>google.</code>). Using words defined in this table as field -names (such as <code>collapse_key</code>) could yield unpredictable outcomes and -is not recommended. Optional.</td> - -  </tr> -  <tr> -    <td><code>delay_while_idle</code></td> -    <td>This parameter specifies whether messages should be delivered when the device -is asleep. A value of <code>1</code> or <code>true</code> indicates -<code>true</code>, and anything else indicates <code>false</code>. Optional. The default -value is <code>false</code>.</td> -  </tr> -  <tr> -    <td><code>time_to_live</code></td> -    <td>Same as JSON (see previous table). Optional.</td> -  </tr> -<tr> -  <td><code>restricted_package_name</code></td> -  <td>Same as JSON (see previous table). Optional. -  </td> -</tr> -<tr> -  <td><code>dry_run</code></td> -  <td>Same as JSON (see previous table). Optional. -  </td> -</tr> -</table> - -<h2 id="receive">Receiving Messages</h2> - -<p>This is the sequence of events that occurs when an Android application -installed on a mobile device receives a message:</p> +<h4 id="payload">Payload</h4> +<p>Optional. If you are including a payload in the message, you use the <code>data</code> +parameter to include the payload. This applies for both HTTP and XMPP.</p> + +<p>See the <a href="{@docRoot}google/gcm/server-ref.html">Server Reference</a> for details on sending +and receiving messages.</p> + +<h2 id="adv">Messaging Concepts and Best Practices</h2> + +<p>This section has a discussion of general messaging topics.</p> + +<h3 id="collapsible">Send-to-Sync  vs. Messages with Payload</h3> + +<p>Every message sent in GCM has the following characteristics:</p> +<ul> +  <li>It has a payload limit of 4096 bytes.</li> +  <li>By default, it is stored by GCM for 4 weeks.</li> +</ul> + +<p>But despite these similarities, messages can behave very differently depending +on their particular settings. One major distinction between messages is whether +they are collapsed (where each new message replaces the preceding message) or not +collapsed (where each individual message is delivered). Every message sent in GCM +is either a "send-to-sync" (collapsible) message or a "message with +payload" (non-collapsible message).</p> + +<h4 id="s2s">Send-to-sync messages</h4> + +<p>A send-to-sync (collapsible) message is often a "tickle" that tells +a mobile application to sync data from the server. For example, suppose you have +an email application. When a user receives new email on the server, the server +pings the mobile application with a "New mail" message. This tells the +application to sync to the server to pick up the new email. The server might send +this message multiple times as new mail continues to accumulate, before the application +has had a chance to sync. But if the user has received 25 new emails, there's no +need to preserve every "New mail" message. One is sufficient. Another +example would be a sports application that updates users with the latest score. +Only the most recent message is relevant. </p> + +<p>GCM allows a maximum of 4 different collapse keys to be used by the GCM server +at any given time. In other words, the GCM server can simultaneously store 4 +different send-to-sync messages per device, each with a different collapse key. +For example, Device A can have A1, A2, A3, and A4. Device B can have B1, B2, B3, +and B4, and so on. If you exceed this number GCM will only keep 4 collapse keys, with no +guarantees about which ones they will be.</p> + +<h3 id="payload">Messages with payload</h3> + +<p>Unlike a send-to-sync message, every "message with payload" +(non-collapsible message) is delivered. The payload the message contains can be +up to 4kb. For example, here is a JSON-formatted message in an IM application in +which spectators are discussing a sporting event:</p> + +<pre class="prettyprint pretty-json">{ +  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", +  "data" : { +    "Nick" : "Mario", +    "Text" : "great match!", +    "Room" : "PortugalVSDenmark", +  }, +}</pre> + +<p>A "message with payload" is not simply a "ping" to the +mobile application to contact the server to fetch data. In the aforementioned IM +application, for example, you would want to deliver every message, because every +message has different content. To specify a non-collapsible message, you simply +omit the <code>collapse_key</code> parameter. Thus GCM will send each message +individually. Note that the order of delivery is not guaranteed.</p> + +<p>GCM will store up to 100 non-collapsible messages. After that, all messages +are discarded from GCM, and a new message is created that tells the client how +far behind it is.</p> + +<p>The application should respond by syncing with the server to recover the +discarded messages. </p> + +<h4 id="which">Which should I use?</h4> +  <p>If your application does not need to use non-collapsible messages, collapsible +messages are a better choice from a performance standpoint. However, if you use +collapsible messages, remember that <strong>GCM only allows a maximum of 4 different collapse +keys to be used by the GCM server per registration ID at any given time</strong>. You must +not exceed this number, or it could cause unpredictable consequences.</p> + +<h3 id="ttl">Setting an Expiration Date for a Message</h3> +<p>You can use the <code>time_to_live</code> parameter in the send request +to specify the maximum lifespan of a message. +The value of this parameter must be a duration from 0 to 2,419,200 seconds, and +it corresponds to the maximum period of time for which GCM will store and try to +deliver the message. Requests that don't contain this field default to the maximum +period of 4 weeks.</p> +<p>Here are some possible uses for this feature:</p> +<ul> +  <li>Video chat incoming calls</li> +  <li>Expiring invitation events</li> +  <li>Calendar events</li> +</ul> +<h4 id="bg">Background </h4> +<p>GCM usually delivers messages immediately after they are sent. However, +this might not always be possible. For example, if the platform is Android, +the device could be turned off, offline, or otherwise unavailable. +Or the sender itself might request +that messages not be delivered until the device becomes active by using the +<code>delay_while_idle</code> flag. Finally, GCM might intentionally delay messages +to prevent an application from consuming excessive resources and negatively +impacting battery life.</p> + +<p>When this happens, GCM will store the message and deliver it as soon as it's +feasible. While this is fine in most cases, there are some applications for which +a late message might as well never be delivered. For example, if the message is +an incoming call or video chat notification, it will only be meaningful for a +small period of time before the call is terminated. Or if the message is an +invitation to an event, it will be useless if received after the event has ended.</p> + +<p>Another advantage of specifying the expiration date for a message is that GCM +will never throttle messages with a <code>time_to_live</code> value of 0 seconds. +In other words, GCM will guarantee best effort for messages that must be delivered +"now or never." Keep in mind that a <code>time_to_live</code> value of +0 means messages that can't be delivered immediately will be discarded. However, +because such messages are never stored, this provides the best latency for +sending notifications.</p> + +<p>Here is an example of a JSON-formatted request that includes TTL:</p> +<pre class="prettyprint pretty-json"> +{ +  "collapse_key" : "demo", +  "delay_while_idle" : true, +  "registration_ids" : ["xyz"], +  "data" : { +    "key1" : "value1", +    "key2" : "value2", +  }, +  "time_to_live" : 3 +}, +</pre> + + +<h3 id="multi-senders">Receiving Messages from Multiple Senders</h3> + +<p>GCM allows multiple parties to send messages to the same application. For +example, suppose your application is an articles aggregator with multiple +contributors, and you want each of them to be able to send a message when they +publish a new article. This message might contain a URL so that the application +can download the article. Instead of having to centralize all sending activity in +one location, GCM gives you the ability to let each of these contributors send +its own messages.</p> + +<p>To make this possible, all you need to do is have each sender generate its own +project number. Then include those IDs in the sender field, separated by commas, +when requesting a registration. Finally, share the registration ID with your +partners, and they'll be able to send messages to your application using their +own authentication keys.</p> + +<p>Note that there is limit of 100 multiple senders.</p> + +<h3 id="lifetime">Lifetime of a Message</h3> + +<p>When a 3rd-party server posts a message to GCM and receives a message ID back, +it does not mean that the message was already delivered to the device. Rather, it +means that it was accepted for delivery. What happens to the message after it is +accepted depends on many factors.</p> + +<p>In the best-case scenario, if the device is connected to GCM, the screen is on, +and there are no throttling restrictions (see <a href="#throttling">Throttling</a>), +the message will be delivered right away.</p> + +<p>If the device is connected but idle, the message will still be +delivered right away unless the <code>delay_while_idle</code> flag is set to true. +Otherwise, it will be stored in the GCM servers until the device is awake. And +that's where the <code>collapse_key</code> flag plays a role: if there is already +a message with the same collapse key (and registration ID) stored and waiting for +delivery, the old message will be discarded and the new message will take its place +(that is, the old message will be collapsed by the new one). However, if the collapse +key is not set, both the new and old messages are stored for future delivery. +Collapsible messages are also called <a href="#s2s">send-to-sync messages</a>.</p> + +<p class="note"><strong>Note:</strong> There is a limit on how many messages can +be stored without collapsing. That limit is currently 100. If the limit is reached, +all stored messages are discarded. Then when the device is back online, it receives +a special message indicating that the limit was reached. The application can then +handle the situation properly, typically by requesting a full sync. +<br><br> +Likewise, there is a limit on how many <code>collapse_key</code>s you can have for +a particular device. GCM allows a maximum of 4 different collapse keys to be used +by the GCM server per device +any given time. In other words, the GCM server can simultaneously store 4 different +send-to-sync messages, each with a different collapse key. If you exceed this number +GCM will only keep 4 collapse keys, with no guarantees about which ones they will be. +See <a href="#s2s">Send-to-sync messages</a> for more information. +</p> + +<p>If the device is not connected to GCM, the message will be stored until a +connection is established (again respecting the collapse key rules). When a connection +is established, GCM will deliver all pending messages to the device, regardless of +the <code>delay_while_idle</code> flag. If the device never gets connected again +(for instance, if it was factory reset), the message will eventually time out and +be discarded from GCM storage. The default timeout is 4 weeks, unless the +<code>time_to_live</code> flag is set.</p> + +<p>Finally, when GCM attempts to deliver a message to the device and the +application was uninstalled, GCM will discard that message right away and +invalidate the registration ID. Future attempts to send a message to that device +will get a <code>NotRegistered</code> error. See <a href="#unreg"> +How Unregistration Works</a> for more information.</p> +<p>Although is not possible to track the status of each individual message, the +Google Cloud Console stats are broken down by messages sent to device, messages +collapsed, and messages waiting for delivery.</p> + +<h3 id="throttling">Throttling</h3> +<p>To prevent abuse (such as sending a flood of messages to a device) and +to optimize for the overall network efficiency and battery life of +devices, GCM implements throttling of messages using a token bucket +scheme. Messages are throttled on a per application and per <a href="#collapsible">collapse +key</a> basis (including non-collapsible messages). Each application +collapse key is granted some initial tokens, and new tokens are granted +periodically therefter. Each token is valid for a single message sent to +the device. If an application collapse key exhausts its supply of +available tokens, new messages are buffered in a pending queue until +new tokens become available at the time of the periodic grant. Thus +throttling in between periodic grant intervals may add to the latency +of message delivery for an application collapse key that sends a large +number of messages within a short period of time. Messages in the pending +queue of an application collapse key may be delivered before the time +of the next periodic grant, if they are piggybacked with messages +belonging to a non-throttled category by GCM for network and battery +efficiency reasons.</p> -<ol> -  <li>The system receives the incoming message and extracts the raw key/value -pairs from the message payload, if any.</li> -  <li>The system passes the key/value pairs to the targeted Android application -in a <code>com.google.android.c2dm.intent.RECEIVE</code> Intent as a set of -extras.</li> -  <li>The Android application extracts the raw data -from the <code>com.google.android.c2dm.intent.RECEIVE</code><code> </code>Intent -by key and processes the data.</li> -</ol> -<p>See the documentation for each connection server for more detail on how it -handles responses.</p> diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs index 0c48a0a2af09..4e8e6386886e 100644 --- a/docs/html/google/google_toc.cs +++ b/docs/html/google/google_toc.cs @@ -169,22 +169,15 @@                <span class="en">HTTP</span></a></li>                </ul>          </li> +        <li><a href="<?cs var:toroot?>google/gcm/server-ref.html"> +            <span class="en">Server Reference</span></a> +        </li>          <li><a href="<?cs var:toroot?>google/gcm/notifications.html">                <span class="en">User Notifications</span></a>          </li> -        <li><a href="<?cs var:toroot?>google/gcm/adv.html"> -            <span class="en">Advanced Topics</span></a> -        </li>          <li><a href="<?cs var:toroot?>google/gcm/c2dm.html">              <span class="en">Migration</span></a>          </li> -        <li id="gcm-tree-list" class="nav-section"> -          <div class="nav-section-header"> -            <a href="<?cs var:toroot ?>reference/gcm-packages.html"> -              <span class="en">Reference</span> -            </a> -          <div> -        </li>        </ul>    </li> diff --git a/docs/html/images/camera2/metadata/android.tonemap.curveRed/gamma_tonemap.png b/docs/html/images/camera2/metadata/android.tonemap.curveRed/gamma_tonemap.png Binary files differindex ec89e37ec2b9..a02fd893b286 100644 --- a/docs/html/images/camera2/metadata/android.tonemap.curveRed/gamma_tonemap.png +++ b/docs/html/images/camera2/metadata/android.tonemap.curveRed/gamma_tonemap.png diff --git a/docs/html/images/camera2/metadata/android.tonemap.curveRed/inverse_tonemap.png b/docs/html/images/camera2/metadata/android.tonemap.curveRed/inverse_tonemap.png Binary files differindex cf0c63ddda42..c309ac5ea887 100644 --- a/docs/html/images/camera2/metadata/android.tonemap.curveRed/inverse_tonemap.png +++ b/docs/html/images/camera2/metadata/android.tonemap.curveRed/inverse_tonemap.png diff --git a/docs/html/images/camera2/metadata/android.tonemap.curveRed/linear_tonemap.png b/docs/html/images/camera2/metadata/android.tonemap.curveRed/linear_tonemap.png Binary files differindex f226a548633e..414fad49a919 100644 --- a/docs/html/images/camera2/metadata/android.tonemap.curveRed/linear_tonemap.png +++ b/docs/html/images/camera2/metadata/android.tonemap.curveRed/linear_tonemap.png diff --git a/docs/html/images/camera2/metadata/android.tonemap.curveRed/rec709_tonemap.png b/docs/html/images/camera2/metadata/android.tonemap.curveRed/rec709_tonemap.png Binary files differnew file mode 100644 index 000000000000..c147a8729f17 --- /dev/null +++ b/docs/html/images/camera2/metadata/android.tonemap.curveRed/rec709_tonemap.png diff --git a/docs/html/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png b/docs/html/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png Binary files differindex ded0645a48ca..4ce2125f3c91 100644 --- a/docs/html/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png +++ b/docs/html/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png diff --git a/docs/html/images/opengl/ogl-triangle-projected.png b/docs/html/images/opengl/ogl-triangle-projected.png Binary files differindex 4b18b98adda1..a561bc569c7f 100644 --- a/docs/html/images/opengl/ogl-triangle-projected.png +++ b/docs/html/images/opengl/ogl-triangle-projected.png diff --git a/docs/html/images/opengl/ogl-triangle-touch.png b/docs/html/images/opengl/ogl-triangle-touch.png Binary files differindex 8323dd9e968f..67c4466cd5fc 100644 --- a/docs/html/images/opengl/ogl-triangle-touch.png +++ b/docs/html/images/opengl/ogl-triangle-touch.png diff --git a/docs/html/images/opengl/ogl-triangle.png b/docs/html/images/opengl/ogl-triangle.png Binary files differindex 66047ab1629a..f51c0c6c1fea 100644 --- a/docs/html/images/opengl/ogl-triangle.png +++ b/docs/html/images/opengl/ogl-triangle.png diff --git a/docs/html/training/graphics/opengl/draw.jd b/docs/html/training/graphics/opengl/draw.jd index ba00627cf6b1..a5880662b05d 100644 --- a/docs/html/training/graphics/opengl/draw.jd +++ b/docs/html/training/graphics/opengl/draw.jd @@ -50,13 +50,21 @@ android.opengl.GLSurfaceView.Renderer#onSurfaceCreated onSurfaceCreated()} metho  for memory and processing efficiency.</p>  <pre> -public void onSurfaceCreated(GL10 unused, EGLConfig config) { +public class MyGLRenderer implements GLSurfaceView.Renderer { +      ... +    private Triangle mTriangle; +    private Square   mSquare; + +    public void onSurfaceCreated(GL10 unused, EGLConfig config) { +        ... -    // initialize a triangle -    mTriangle = new Triangle(); -    // initialize a square -    mSquare = new Square(); +        // initialize a triangle +        mTriangle = new Triangle(); +        // initialize a square +        mSquare = new Square(); +    } +    ...  }  </pre> @@ -77,21 +85,27 @@ one or more shapes.</li>  <p>You need at least one vertex shader to draw a shape and one fragment shader to color that shape.  These shaders must be complied and then added to an OpenGL ES program, which is then used to draw -the shape. Here is an example of how to define basic shaders you can use to draw a shape:</p> +the shape. Here is an example of how to define basic shaders you can use to draw a shape in the +<code>Triangle</code> class:</p>  <pre> -private final String vertexShaderCode = -    "attribute vec4 vPosition;" + -    "void main() {" + -    "  gl_Position = vPosition;" + -    "}"; - -private final String fragmentShaderCode = -    "precision mediump float;" + -    "uniform vec4 vColor;" + -    "void main() {" + -    "  gl_FragColor = vColor;" + -    "}"; +public class Triangle { + +    private final String vertexShaderCode = +        "attribute vec4 vPosition;" + +        "void main() {" + +        "  gl_Position = vPosition;" + +        "}"; + +    private final String fragmentShaderCode = +        "precision mediump float;" + +        "uniform vec4 vColor;" + +        "void main() {" + +        "  gl_FragColor = vColor;" + +        "}"; + +    ... +}  </pre>  <p>Shaders contain OpenGL Shading Language (GLSL) code that must be compiled prior to using it in @@ -125,13 +139,28 @@ get created once and then cached for later use.</p>  public class Triangle() {      ... -    int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); -    int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); +    private final int mProgram; + +    public Triangle() { +        ... + +        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, +                                        vertexShaderCode); +        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, +                                        fragmentShaderCode); + +        // create empty OpenGL ES Program +        mProgram = GLES20.glCreateProgram(); -    mProgram = GLES20.glCreateProgram();             // create empty OpenGL ES Program -    GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program -    GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program -    GLES20.glLinkProgram(mProgram);                  // creates OpenGL ES program executables +        // add the vertex shader to program +        GLES20.glAttachShader(mProgram, vertexShader); + +        // add the fragment shader to program +        GLES20.glAttachShader(mProgram, fragmentShader); + +        // creates OpenGL ES program executables +        GLES20.glLinkProgram(mProgram); +    }  }  </pre> @@ -145,6 +174,12 @@ color values to the shape’s vertex shader and fragment shader, and then execut  function.</p>  <pre> +private int mPositionHandle; +private int mColorHandle; + +private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX; +private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex +  public void draw() {      // Add program to OpenGL ES environment      GLES20.glUseProgram(mProgram); @@ -176,8 +211,17 @@ public void draw() {  <p>Once you have all this code in place, drawing this object just requires a call to the  {@code draw()} method from within your renderer’s {@link -android.opengl.GLSurfaceView.Renderer#onDrawFrame onDrawFrame()} method. When you run the -application, it should look something like this:</p> +android.opengl.GLSurfaceView.Renderer#onDrawFrame onDrawFrame()} method: + +<pre> +public void onDrawFrame(GL10 unused) { +    ... + +    mTriangle.draw(); +} +</pre> + +<p>When you run the application, it should look something like this:</p>  <img src="{@docRoot}images/opengl/ogl-triangle.png">  <p class="img-caption"> diff --git a/docs/html/training/graphics/opengl/environment.jd b/docs/html/training/graphics/opengl/environment.jd index 6b00c764f5e0..cf2b64ad8000 100644 --- a/docs/html/training/graphics/opengl/environment.jd +++ b/docs/html/training/graphics/opengl/environment.jd @@ -129,28 +129,22 @@ just create an inner class in the activity that uses it:</p>  <pre>  class MyGLSurfaceView extends GLSurfaceView { +    private final MyGLRenderer mRenderer; +      public MyGLSurfaceView(Context context){          super(context); +        // Create an OpenGL ES 2.0 context +        setEGLContextClientVersion(2); + +        mRenderer = new MyGLRenderer(); +          // Set the Renderer for drawing on the GLSurfaceView -        setRenderer(new MyRenderer()); +        setRenderer(mRenderer);      }  }  </pre> -<p>When using OpenGL ES 2.0, you must add another call to your {@link android.opengl.GLSurfaceView} -constructor, specifying that you want to use the 2.0 API:</p> - -<pre> -// Create an OpenGL ES 2.0 context -setEGLContextClientVersion(2); -</pre> - -<p class="note"><strong>Note:</strong> If you are using the OpenGL ES 2.0 API, make sure you declare -this in your application manifest. For more information, see <a href="#manifest">Declare OpenGL ES -Use -in the Manifest</a>.</p> -  <p>One other optional addition to your {@link android.opengl.GLSurfaceView} implementation is to set  the render mode to only draw the view when there is a change to your drawing data using the  {@link android.opengl.GLSurfaceView#RENDERMODE_WHEN_DIRTY GLSurfaceView.RENDERMODE_WHEN_DIRTY} @@ -186,7 +180,7 @@ the geometry of the view changes, for example when the device's screen orientati  </ul>  <p>Here is a very basic implementation of an OpenGL ES renderer, that does nothing more than draw a -gray background in the {@link android.opengl.GLSurfaceView}:</p> +black background in the {@link android.opengl.GLSurfaceView}:</p>  <pre>  public class MyGLRenderer implements GLSurfaceView.Renderer { @@ -208,7 +202,7 @@ public class MyGLRenderer implements GLSurfaceView.Renderer {  </pre>  <p>That’s all there is to it! The code examples above create a simple Android application that -displays a gray screen using OpenGL. While this code does not do anything very interesting, by +displays a black screen using OpenGL. While this code does not do anything very interesting, by  creating these classes, you have laid the foundation you need to start drawing graphic elements with  OpenGL.</p> diff --git a/docs/html/training/graphics/opengl/motion.jd b/docs/html/training/graphics/opengl/motion.jd index fbcdd7fdfcc0..b026a4a31dbb 100644 --- a/docs/html/training/graphics/opengl/motion.jd +++ b/docs/html/training/graphics/opengl/motion.jd @@ -45,16 +45,17 @@ to a shape with rotation.</p>  <h2 id="rotate">Rotate a Shape</h2> -<p>Rotating a drawing object with OpenGL ES 2.0 is relatively simple. You create another -transformation matrix (a rotation matrix) and then combine it with your projection and +<p>Rotating a drawing object with OpenGL ES 2.0 is relatively simple. In your renderer, create +another transformation matrix (a rotation matrix) and then combine it with your projection and  camera view transformation matrices:</p>  <pre>  private float[] mRotationMatrix = new float[16];  public void onDrawFrame(GL10 gl) { -    ...      float[] scratch = new float[16]; +    ... +      // Create a rotation transformation for the triangle      long time = SystemClock.uptimeMillis() % 4000L;      float angle = 0.090f * ((int) time); diff --git a/docs/html/training/graphics/opengl/projection.jd b/docs/html/training/graphics/opengl/projection.jd index b09e74ce61ea..356d5d42b792 100644 --- a/docs/html/training/graphics/opengl/projection.jd +++ b/docs/html/training/graphics/opengl/projection.jd @@ -71,6 +71,11 @@ projection transformation {@link android.opengl.Matrix} using the {@link  android.opengl.Matrix#frustumM Matrix.frustumM()} method:</p>  <pre> +// mMVPMatrix is an abbreviation for "Model View Projection Matrix" +private final float[] mMVPMatrix = new float[16]; +private final float[] mProjectionMatrix = new float[16]; +private final float[] mViewMatrix = new float[16]; +  @Override  public void onSurfaceChanged(GL10 unused, int width, int height) {      GLES20.glViewport(0, 0, width, height); @@ -95,10 +100,10 @@ view transformation in order for anything to show up on screen.</p>  <h2 id="camera-view">Define a Camera View</h2>  <p>Complete the process of transforming your drawn objects by adding a camera view transformation as -part of the drawing process. In the following example code, the camera view transformation is -calculated using the {@link android.opengl.Matrix#setLookAtM Matrix.setLookAtM()} method and then -combined with the previously calculated projection matrix. The combined transformation matrices -are then passed to the drawn shape.</p> +part of the drawing process in your renderer. In the following example code, the camera view +transformation is calculated using the {@link android.opengl.Matrix#setLookAtM Matrix.setLookAtM()} +method and then combined with the previously calculated projection matrix. The combined +transformation matrices are then passed to the drawn shape.</p>  <pre>  @Override @@ -119,7 +124,32 @@ public void onDrawFrame(GL10 unused) {  <h2 id="#transform">Apply Projection and Camera Transformations</h2>  <p>In order to use the combined projection and camera view transformation matrix shown in the -previews sections, modify the {@code draw()} method of your graphic objects to accept the combined +previews sections, first add a matrix variable to the <em>vertex shader</em> previously defined +in the <code>Triangle</code> class:</p> + +<pre> +public class Triangle { + +    private final String vertexShaderCode = +        // This matrix member variable provides a hook to manipulate +        // the coordinates of the objects that use this vertex shader +        <strong>"uniform mat4 uMVPMatrix;" +</strong> +        "attribute vec4 vPosition;" + +        "void main() {" + +        // the matrix must be included as a modifier of gl_Position +        // Note that the uMVPMatrix factor *must be first* in order +        // for the matrix multiplication product to be correct. +        "  gl_Position = <strong>uMVPMatrix</strong> * vPosition;" + +        "}"; + +    // Use to access and set the view transformation +    private int mMVPMatrixHandle; + +    ... +} +</pre> + +<p>Next, modify the {@code draw()} method of your graphic objects to accept the combined  transformation matrix and apply it to the shape:</p>  <pre> @@ -127,14 +157,16 @@ public void draw(float[] mvpMatrix) { // pass in the calculated transformation m      ...      // get handle to shape's transformation matrix -    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); +    <strong>mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");</strong>      // Pass the projection and view transformation to the shader -    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); +    <strong>GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);</strong>      // Draw the triangle      GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); -    ... + +    // Disable vertex array +    GLES20.glDisableVertexAttribArray(mPositionHandle);  }  </pre> diff --git a/docs/html/training/graphics/opengl/touch.jd b/docs/html/training/graphics/opengl/touch.jd index 4c9f0c77be55..089ede7b63da 100644 --- a/docs/html/training/graphics/opengl/touch.jd +++ b/docs/html/training/graphics/opengl/touch.jd @@ -50,6 +50,10 @@ android.opengl.GLSurfaceView#onTouchEvent onTouchEvent()} to listen for touch ev  an angle of rotation for a shape.</p>  <pre> +private final float TOUCH_SCALE_FACTOR = 180.0f / 320; +private float mPreviousX; +private float mPreviousY; +  @Override  public boolean onTouchEvent(MotionEvent e) {      // MotionEvent reports input details from the touch screen @@ -77,7 +81,7 @@ public boolean onTouchEvent(MotionEvent e) {              mRenderer.setAngle(                      mRenderer.getAngle() + -                    ((dx + dy) * TOUCH_SCALE_FACTOR);  // = 180.0f / 320 +                    ((dx + dy) * TOUCH_SCALE_FACTOR));              requestRender();      } @@ -108,12 +112,22 @@ public MyGLSurfaceView(Context context) {  <p>The example code above requires that you expose the rotation angle through your renderer by  adding a public member. Since the renderer code is running on a separate thread from the main user  interface thread of your application, you must declare this public variable as {@code volatile}. -Here is the code to do that:</p> +Here is the code to declare the variable and expose the getter and setter pair:</p>  <pre>  public class MyGLRenderer implements GLSurfaceView.Renderer {      ... +      public volatile float mAngle; + +    public float getAngle() { +        return mAngle; +    } + +    public void setAngle(float angle) { +        mAngle = angle; +    } +}  </pre> diff --git a/docs/html/training/wearables/watch-faces/index.jd b/docs/html/training/wearables/watch-faces/index.jd index c7affd1f3640..453c30e28cce 100644 --- a/docs/html/training/wearables/watch-faces/index.jd +++ b/docs/html/training/wearables/watch-faces/index.jd @@ -21,6 +21,14 @@ page.title=Creating Watch Faces    </div>  </a> +<a class="notice-developers-video wide" +    href="https://www.youtube.com/watch?v=AK38PJZmIW8"> +<div> +    <h3>Video</h3> +    <p>DevBytes: Watch Faces for Android Wear</p> +</div> +</a> +  <p>Watch faces in Android Wear leverage a dynamic digital canvas to tell time using colors,  animations, and relevant contextual information. The <a  href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app">Android diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 505bd1dacaf2..9e4674b00313 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -92,6 +92,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {      private int[] mPaddingB;      private final Rect mTmpRect = new Rect(); +    private final Rect mTmpOutRect = new Rect(); +    private final Rect mTmpContainer = new Rect();      private Rect mHotspotBounds;      private boolean mMutated; @@ -945,7 +947,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {          int padR = 0;          int padB = 0; -        final Rect outRect = mTmpRect; +        final Rect outRect = mTmpOutRect;          final int layoutDirection = getLayoutDirection();          final boolean nest = mLayerState.mPaddingMode == PADDING_MODE_NEST;          final ChildDrawable[] array = mLayerState.mChildren; @@ -953,7 +955,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {          for (int i = 0; i < N; i++) {              final ChildDrawable r = array[i];              final Drawable d = r.mDrawable; -            final Rect container = d.getBounds(); +            final Rect container = mTmpContainer; +            container.set(d.getBounds());              // Take the resolved layout direction into account. If start / end              // padding are defined, they will be resolved (hence overriding) to diff --git a/libs/hwui/Glop.h b/libs/hwui/Glop.h index 9150869884c5..e2adff812708 100644 --- a/libs/hwui/Glop.h +++ b/libs/hwui/Glop.h @@ -65,7 +65,7 @@ struct Glop {       * Stores mesh - vertex and index data.       *       * buffer objects and void*s are mutually exclusive -     * indices are optional +     * indices are optional, currently only GL_UNSIGNED_SHORT supported       */      struct Mesh {          VertexAttribFlags vertexFlags; diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp index e22af40a3c4c..5373275ece7f 100644 --- a/libs/hwui/GlopBuilder.cpp +++ b/libs/hwui/GlopBuilder.cpp @@ -35,6 +35,10 @@ namespace uirenderer {      LOG_ALWAYS_FATAL_IF(stageFlag & mStageFlags, "Stage %d cannot be run twice"); \      mStageFlags = static_cast<StageFlags>(mStageFlags | stageFlag) +#define REQUIRE_STAGES(requiredFlags) \ +    LOG_ALWAYS_FATAL_IF((mStageFlags & requiredFlags) != requiredFlags, \ +            "not prepared for current stage") +  GlopBuilder::GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop)          : mRenderState(renderState)          , mCaches(caches) @@ -78,6 +82,21 @@ GlopBuilder& GlopBuilder::setMeshUnitQuad() {      return *this;  } +GlopBuilder& GlopBuilder::setMeshIndexedQuads(void* vertexData, int quadCount) { +    TRIGGER_STAGE(kMeshStage); + +    mOutGlop->mesh.vertexFlags = kNone_Attrib; +    mOutGlop->mesh.primitiveMode = GL_TRIANGLES; +    mOutGlop->mesh.vertexBufferObject = 0; +    mOutGlop->mesh.vertices = vertexData; +    mOutGlop->mesh.indexBufferObject = mRenderState.meshState().getQuadListIBO(); +    mOutGlop->mesh.indices = nullptr; +    mOutGlop->mesh.vertexCount = 6 * quadCount; +    mOutGlop->mesh.stride = kVertexStride; + +    return *this; +} +  GlopBuilder& GlopBuilder::setTransform(const Matrix4& ortho,          const Matrix4& transform, bool fudgingOffset) {      TRIGGER_STAGE(kTransformStage); @@ -90,6 +109,7 @@ GlopBuilder& GlopBuilder::setTransform(const Matrix4& ortho,  GlopBuilder& GlopBuilder::setModelViewMapUnitToRect(const Rect destination) {      TRIGGER_STAGE(kModelViewStage); +      mOutGlop->transform.modelView.loadTranslate(destination.left, destination.top, 0.0f);      mOutGlop->transform.modelView.scale(destination.getWidth(), destination.getHeight(), 1.0f);      mOutGlop->bounds = destination; @@ -98,22 +118,45 @@ GlopBuilder& GlopBuilder::setModelViewMapUnitToRect(const Rect destination) {  GlopBuilder& GlopBuilder::setModelViewOffsetRect(float offsetX, float offsetY, const Rect source) {      TRIGGER_STAGE(kModelViewStage); +      mOutGlop->transform.modelView.loadTranslate(offsetX, offsetY, 0.0f);      mOutGlop->bounds = source;      mOutGlop->bounds.translate(offsetX, offsetY);      return *this;  } -GlopBuilder& GlopBuilder::setPaint(const SkPaint* paint, float alphaScale) { +GlopBuilder& GlopBuilder::setOptionalPaint(const SkPaint* paint, float alphaScale) { +    if (paint) { +        return setPaint(*paint, alphaScale); +    } + +    TRIGGER_STAGE(kFillStage); +    REQUIRE_STAGES(kMeshStage); + +    mOutGlop->fill.color = { alphaScale, alphaScale, alphaScale, alphaScale }; + +    const bool SWAP_SRC_DST = false; +    // TODO: account for texture blend +    if (alphaScale < 1.0f +            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)) { +        Blend::getFactors(SkXfermode::kSrcOver_Mode, SWAP_SRC_DST, +                &mOutGlop->blend.src, &mOutGlop->blend.dst); +    } else { +        mOutGlop->blend = { GL_ZERO, GL_ZERO }; +    } + +    return *this; +} +GlopBuilder& GlopBuilder::setPaint(const SkPaint& paint, float alphaScale) {      TRIGGER_STAGE(kFillStage); +    REQUIRE_STAGES(kMeshStage); -    // TODO: support null paint -    const SkShader* shader = paint->getShader(); -    const SkColorFilter* colorFilter = paint->getColorFilter(); +    const SkShader* shader = paint.getShader(); +    const SkColorFilter* colorFilter = paint.getColorFilter(); -    SkXfermode::Mode mode = PaintUtils::getXfermode(paint->getXfermode()); +    SkXfermode::Mode mode = PaintUtils::getXfermode(paint.getXfermode());      if (mode != SkXfermode::kClear_Mode) { -        int color = paint->getColor(); +        int color = paint.getColor();          float alpha = (SkColorGetA(color) / 255.0f) * alphaScale;          if (!shader) {              float colorScale = alpha / 255.0f; @@ -133,6 +176,7 @@ GlopBuilder& GlopBuilder::setPaint(const SkPaint* paint, float alphaScale) {      mOutGlop->blend = { GL_ZERO, GL_ZERO };      if (mOutGlop->fill.color.a < 1.0f +            || (mOutGlop->mesh.vertexFlags & kAlpha_Attrib)              || PaintUtils::isBlendedShader(shader)              || PaintUtils::isBlendedColorFilter(colorFilter)              || mode != SkXfermode::kSrcOver_Mode) { @@ -195,6 +239,8 @@ GlopBuilder& GlopBuilder::setPaint(const SkPaint* paint, float alphaScale) {              colorVector[1] = srcColorMatrix[9] / 255.0f;              colorVector[2] = srcColorMatrix[14] / 255.0f;              colorVector[3] = srcColorMatrix[19] / 255.0f; +        } else { +            LOG_ALWAYS_FATAL("unsupported ColorFilter");          }      } else {          mOutGlop->fill.filterMode = ProgramDescription::kColorNone; @@ -204,7 +250,7 @@ GlopBuilder& GlopBuilder::setPaint(const SkPaint* paint, float alphaScale) {  }  void GlopBuilder::build() { -    LOG_ALWAYS_FATAL_IF(mStageFlags != kAllStages, "glop not fully prepared!"); +    REQUIRE_STAGES(kAllStages);      mDescription.modulate = mOutGlop->fill.color.a < 1.0f;      mOutGlop->fill.program = mCaches.programCache.get(mDescription); diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h index c7464cd04183..48ce81ab8425 100644 --- a/libs/hwui/GlopBuilder.h +++ b/libs/hwui/GlopBuilder.h @@ -36,15 +36,18 @@ class GlopBuilder {      PREVENT_COPY_AND_ASSIGN(GlopBuilder);  public:      GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop); +      GlopBuilder& setMeshUnitQuad();      GlopBuilder& setMeshVertexBuffer(const VertexBuffer& vertexBuffer, bool shadowInterp); +    GlopBuilder& setMeshIndexedQuads(void* vertexData, int quadCount);      GlopBuilder& setTransform(const Matrix4& ortho, const Matrix4& transform, bool fudgingOffset);      GlopBuilder& setModelViewMapUnitToRect(const Rect destination);      GlopBuilder& setModelViewOffsetRect(float offsetX, float offsetY, const Rect source); -    GlopBuilder& setPaint(const SkPaint* paint, float alphaScale); +    GlopBuilder& setOptionalPaint(const SkPaint* paint, float alphaScale); +    GlopBuilder& setPaint(const SkPaint& paint, float alphaScale);      void build();  private:      enum StageFlags { diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 5a0cc1e90ab1..61cd16f501e4 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1581,7 +1581,12 @@ void OpenGLRenderer::renderGlop(const Glop& glop) {          setStencilFromClip();      }      mRenderState.render(glop); -    dirtyLayer(glop.bounds.left, glop.bounds.top, glop.bounds.right, glop.bounds.bottom); + +    if (!mRenderState.stencil().isWriteEnabled()) { +        // TODO: specify more clearly when a draw should dirty the layer. +        // is writing to the stencil the only time we should ignore this? +        dirtyLayer(glop.bounds.left, glop.bounds.top, glop.bounds.right, glop.bounds.bottom); +    }  }  /////////////////////////////////////////////////////////////////////////////// @@ -2353,13 +2358,12 @@ void OpenGLRenderer::drawVertexBuffer(float translateX, float translateY,          aBuilder.setMeshVertexBuffer(vertexBuffer, shadowInterp)                  .setTransform(currentSnapshot()->getOrthoMatrix(), *currentTransform(), fudgeOffset)                  .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds()) -                .setPaint(paint, currentSnapshot()->alpha) +                .setPaint(*paint, currentSnapshot()->alpha)                  .build();          renderGlop(glop);          return;      } -      const VertexBuffer::MeshFeatureFlags meshFeatureFlags = vertexBuffer.getMeshFeatureFlags();      Rect bounds(vertexBuffer.getBounds());      bounds.translate(translateX, translateY); @@ -3218,12 +3222,6 @@ void OpenGLRenderer::drawColorRects(const float* rects, int count, const SkPaint          return;      } -    int color = paint->getColor(); -    // If a shader is set, preserve only the alpha -    if (getShader(paint)) { -        color |= 0x00ffffff; -    } -      float left = FLT_MAX;      float top = FLT_MAX;      float right = FLT_MIN; @@ -3253,6 +3251,25 @@ void OpenGLRenderer::drawColorRects(const float* rects, int count, const SkPaint          return;      } +    if (!paint->getShader() && !currentSnapshot()->roundRectClipState) { +        const Matrix4& transform = ignoreTransform ? Matrix4::identity() : *currentTransform(); +        Glop glop; +        GlopBuilder aBuilder(mRenderState, mCaches, &glop); +        aBuilder.setMeshIndexedQuads(&mesh[0], count / 4) +                .setTransform(currentSnapshot()->getOrthoMatrix(), transform, false) +                .setModelViewOffsetRect(0, 0, Rect(left, top, right, bottom)) +                .setPaint(*paint, currentSnapshot()->alpha) +                .build(); +        renderGlop(glop); +        return; +    } + +    int color = paint->getColor(); +    // If a shader is set, preserve only the alpha +    if (getShader(paint)) { +        color |= 0x00ffffff; +    } +      setupDraw();      setupDrawNoTexture();      setupDrawColor(color, ((color >> 24) & 0xFF) * currentSnapshot()->alpha); @@ -3286,7 +3303,7 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot          aBuilder.setMeshUnitQuad()                  .setTransform(currentSnapshot()->getOrthoMatrix(), transform, false)                  .setModelViewMapUnitToRect(Rect(left, top, right, bottom)) -                .setPaint(paint, currentSnapshot()->alpha) +                .setPaint(*paint, currentSnapshot()->alpha)                  .build();          renderGlop(glop);          return; diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp index ce6030d16ff0..585fb862b8fa 100644 --- a/libs/hwui/renderstate/MeshState.cpp +++ b/libs/hwui/renderstate/MeshState.cpp @@ -31,13 +31,29 @@ MeshState::MeshState()          , mCurrentTexCoordsStride(0)          , mTexCoordsArrayEnabled(false)          , mQuadListIndices(0) { -      glGenBuffers(1, &mUnitQuadBuffer);      glBindBuffer(GL_ARRAY_BUFFER, mUnitQuadBuffer);      glBufferData(GL_ARRAY_BUFFER, sizeof(kUnitQuadVertices), kUnitQuadVertices, GL_STATIC_DRAW);      mCurrentBuffer = mUnitQuadBuffer; +    std::unique_ptr<uint16_t[]> regionIndices(new uint16_t[kMaxNumberOfQuads * 6]); +    for (uint32_t i = 0; i < kMaxNumberOfQuads; i++) { +        uint16_t quad = i * 4; +        int index = i * 6; +        regionIndices[index    ] = quad;       // top-left +        regionIndices[index + 1] = quad + 1;   // top-right +        regionIndices[index + 2] = quad + 2;   // bottom-left +        regionIndices[index + 3] = quad + 2;   // bottom-left +        regionIndices[index + 4] = quad + 1;   // top-right +        regionIndices[index + 5] = quad + 3;   // bottom-right +    } +    glGenBuffers(1, &mQuadListIndices); +    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mQuadListIndices); +    glBufferData(GL_ELEMENT_ARRAY_BUFFER, kMaxNumberOfQuads * 6 * sizeof(uint16_t), +            regionIndices.get(), GL_STATIC_DRAW); +    mCurrentIndicesBuffer = mQuadListIndices; +      // position attribute always enabled      glEnableVertexAttribArray(Program::kBindingPosition);  } @@ -51,7 +67,11 @@ MeshState::~MeshState() {  }  void MeshState::dump() { -    ALOGD("MeshState vertices: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer); +    ALOGD("MeshState VBOs: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer); +    ALOGD("MeshState vertices: vertex data %p, stride %d", +            mCurrentPositionPointer, mCurrentPositionStride); +    ALOGD("MeshState texCoord: data %p, stride %d", +            mCurrentTexCoordsPointer, mCurrentTexCoordsStride);  }  /////////////////////////////////////////////////////////////////////////////// @@ -138,26 +158,6 @@ bool MeshState::bindIndicesBufferInternal(const GLuint buffer) {  }  bool MeshState::bindQuadIndicesBuffer() { -    if (!mQuadListIndices) { -        std::unique_ptr<uint16_t[]> regionIndices(new uint16_t[kMaxNumberOfQuads * 6]); -        for (uint32_t i = 0; i < kMaxNumberOfQuads; i++) { -            uint16_t quad = i * 4; -            int index = i * 6; -            regionIndices[index    ] = quad;       // top-left -            regionIndices[index + 1] = quad + 1;   // top-right -            regionIndices[index + 2] = quad + 2;   // bottom-left -            regionIndices[index + 3] = quad + 2;   // bottom-left -            regionIndices[index + 4] = quad + 1;   // top-right -            regionIndices[index + 5] = quad + 3;   // bottom-right -        } - -        glGenBuffers(1, &mQuadListIndices); -        bool force = bindIndicesBufferInternal(mQuadListIndices); -        glBufferData(GL_ELEMENT_ARRAY_BUFFER, kMaxNumberOfQuads * 6 * sizeof(uint16_t), -                regionIndices.get(), GL_STATIC_DRAW); -        return force; -    } -      return bindIndicesBufferInternal(mQuadListIndices);  } diff --git a/libs/hwui/renderstate/MeshState.h b/libs/hwui/renderstate/MeshState.h index afc626735f97..3c92ad839695 100644 --- a/libs/hwui/renderstate/MeshState.h +++ b/libs/hwui/renderstate/MeshState.h @@ -114,6 +114,7 @@ public:      // Getters - for use in Glop building      ///////////////////////////////////////////////////////////////////////////////      GLuint getUnitQuadVBO() { return mUnitQuadBuffer; } +    GLuint getQuadListIBO() { return mQuadListIndices; }  private:      MeshState();      bool bindMeshBufferInternal(const GLuint buffer); diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index ba49833d7413..6394dc13a8ee 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -204,12 +204,7 @@ void RenderState::postDecStrong(VirtualLightRefBase* object) {   *   * Textures + coordinates   * SkiaShader - * ColorFilter - * -    // TODO: texture coord -    // TODO: texture support -    // TODO: skiashader support -    // TODO: color filter support + * RoundRect clipping   */  void RenderState::render(const Glop& glop) { @@ -251,18 +246,18 @@ void RenderState::render(const Glop& glop) {      // indices      meshState().bindIndicesBufferInternal(mesh.indexBufferObject); -    if (glop.mesh.vertexFlags & kTextureCoord_Attrib) { +    if (mesh.vertexFlags & kTextureCoord_Attrib) {          // TODO: support textures          LOG_ALWAYS_FATAL("textures not yet supported");      } else {          meshState().disableTexCoordsVertexArray();      } -    if (glop.mesh.vertexFlags & kColor_Attrib) { +    if (mesh.vertexFlags & kColor_Attrib) {          LOG_ALWAYS_FATAL("color vertex attribute not yet supported");          // TODO: enable color, disable when done      }      int alphaSlot = -1; -    if (glop.mesh.vertexFlags & kAlpha_Attrib) { +    if (mesh.vertexFlags & kAlpha_Attrib) {          const void* alphaCoords = ((const GLbyte*) glop.mesh.vertices) + kVertexAlphaOffset;          alphaSlot = shader.program->getAttrib("vtxAlpha");          glEnableVertexAttribArray(alphaSlot); @@ -275,15 +270,31 @@ void RenderState::render(const Glop& glop) {      blend().setFactors(glop.blend.src, glop.blend.dst);      // ------------------------------------ -    // ---------- GL state setup ---------- +    // ---------- Actual drawing ----------      // ------------------------------------ -    if (mesh.indexBufferObject || mesh.indices) { -        glDrawElements(glop.mesh.primitiveMode, glop.mesh.vertexCount, -                GL_UNSIGNED_SHORT, mesh.indices); +    if (mesh.indexBufferObject == meshState().getQuadListIBO()) { +        // Since the indexed quad list is of limited length, we loop over +        // the glDrawXXX method while updating the vertex pointer +        GLsizei elementsCount = mesh.vertexCount; +        const GLbyte* vertices = static_cast<const GLbyte*>(mesh.vertices); +        while (elementsCount > 0) { +            GLsizei drawCount = MathUtils::min(elementsCount, (GLsizei) kMaxNumberOfQuads * 6); + +            // TODO: this double binds on first pass +            meshState().bindPositionVertexPointer(true, vertices, mesh.stride); +            glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr); +            elementsCount -= drawCount; +            vertices += (drawCount / 6) * 4 * mesh.stride; +        } +    } else if (mesh.indexBufferObject || mesh.indices) { +        glDrawElements(mesh.primitiveMode, mesh.vertexCount, GL_UNSIGNED_SHORT, mesh.indices);      } else { -        glDrawArrays(glop.mesh.primitiveMode, 0, glop.mesh.vertexCount); +        glDrawArrays(mesh.primitiveMode, 0, mesh.vertexCount);      } +    // ----------------------------------- +    // ---------- Mesh teardown ---------- +    // -----------------------------------      if (glop.mesh.vertexFlags & kAlpha_Attrib) {          glDisableVertexAttribArray(alphaSlot);      } diff --git a/libs/hwui/renderstate/Stencil.h b/libs/hwui/renderstate/Stencil.h index a88beaeb6c34..e4f0f3f07ac6 100644 --- a/libs/hwui/renderstate/Stencil.h +++ b/libs/hwui/renderstate/Stencil.h @@ -98,6 +98,10 @@ public:          return mState == kTest;      } +    bool isWriteEnabled() { +        return mState == kWrite; +    } +      void dump();  private: diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp index 5f445f46dbdb..b6d2c4d996d8 100644 --- a/libs/hwui/tests/main.cpp +++ b/libs/hwui/tests/main.cpp @@ -210,7 +210,7 @@ public:          renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);          renderer->insertReorderBarrier(true); -        card = createCard(40, 40, 200, 200); +        card = createCard(40, 40, 400, 400);          renderer->drawRenderNode(card.get(), DUMMY, 0);          renderer->insertReorderBarrier(false); @@ -228,11 +228,10 @@ private:          node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);          DisplayListRenderer* renderer = startRecording(node.get()); -        renderer->drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode);          SkPaint paint;          paint.setAntiAlias(true); -        paint.setColor(0xFF00FFFF); +        paint.setColor(0xFF000000);          renderer->drawOval(0, 0, width, height, paint);          endRecording(renderer, node.get()); diff --git a/media/java/android/media/AudioFocusInfo.java b/media/java/android/media/AudioFocusInfo.java index fbdda3ce4dee..540c328f834b 100644 --- a/media/java/android/media/AudioFocusInfo.java +++ b/media/java/android/media/AudioFocusInfo.java @@ -45,8 +45,9 @@ public final class AudioFocusInfo implements Parcelable {       * @param gainRequest       * @param lossReceived       * @param flags +     * @hide       */ -    AudioFocusInfo(AudioAttributes aa, String clientId, String packageName, +    public AudioFocusInfo(AudioAttributes aa, String clientId, String packageName,              int gainRequest, int lossReceived, int flags) {          mAttributes = aa == null ? new AudioAttributes.Builder().build() : aa;          mClientId = clientId == null ? "" : clientId; @@ -91,7 +92,7 @@ public final class AudioFocusInfo implements Parcelable {      public int getLossReceived() { return mLossReceived; }      /** @hide */ -    void clearLossReceived() { mLossReceived = 0; } +    public void clearLossReceived() { mLossReceived = 0; }      /**       * The flags set in the audio focus request. diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 07b19a49bc94..7084eba2b09f 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -663,8 +663,7 @@ public class AudioManager {          int keyCode = event.getKeyCode();          if (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && keyCode != KeyEvent.KEYCODE_VOLUME_UP                  && keyCode != KeyEvent.KEYCODE_VOLUME_MUTE -                && mVolumeKeyUpTime + AudioService.PLAY_SOUND_DELAY -                        > SystemClock.uptimeMillis()) { +                && mVolumeKeyUpTime + AudioSystem.PLAY_SOUND_DELAY > SystemClock.uptimeMillis()) {              /*               * The user has hit another key during the delay (e.g., 300ms)               * since the last volume key up, so cancel any sounds. @@ -2501,7 +2500,7 @@ public class AudioManager {              service.requestAudioFocus(new AudioAttributes.Builder()                          .setInternalLegacyStreamType(streamType).build(),                      durationHint, mICallBack, null, -                    MediaFocusControl.IN_VOICE_COMM_FOCUS_ID, +                    AudioSystem.IN_VOICE_COMM_FOCUS_ID,                      mContext.getOpPackageName(),                      AUDIOFOCUS_FLAG_LOCK,                      null /* policy token */); @@ -2519,7 +2518,7 @@ public class AudioManager {      public void abandonAudioFocusForCall() {          IAudioService service = getService();          try { -            service.abandonAudioFocus(null, MediaFocusControl.IN_VOICE_COMM_FOCUS_ID, +            service.abandonAudioFocus(null, AudioSystem.IN_VOICE_COMM_FOCUS_ID,                      null /*AudioAttributes, legacy behavior*/);          } catch (RemoteException e) {              Log.e(TAG, "Can't call abandonAudioFocusForCall() on AudioService:", e); diff --git a/media/java/android/media/AudioRoutesInfo.java b/media/java/android/media/AudioRoutesInfo.java index 3e0ec07fc30b..6ae0d46c0d75 100644 --- a/media/java/android/media/AudioRoutesInfo.java +++ b/media/java/android/media/AudioRoutesInfo.java @@ -25,27 +25,27 @@ import android.text.TextUtils;   * @hide   */  public class AudioRoutesInfo implements Parcelable { -    static final int MAIN_SPEAKER = 0; -    static final int MAIN_HEADSET = 1<<0; -    static final int MAIN_HEADPHONES = 1<<1; -    static final int MAIN_DOCK_SPEAKERS = 1<<2; -    static final int MAIN_HDMI = 1<<3; -    static final int MAIN_USB = 1<<4; +    public static final int MAIN_SPEAKER = 0; +    public static final int MAIN_HEADSET = 1<<0; +    public static final int MAIN_HEADPHONES = 1<<1; +    public static final int MAIN_DOCK_SPEAKERS = 1<<2; +    public static final int MAIN_HDMI = 1<<3; +    public static final int MAIN_USB = 1<<4; -    CharSequence mBluetoothName; -    int mMainType = MAIN_SPEAKER; +    public CharSequence bluetoothName; +    public int mainType = MAIN_SPEAKER;      public AudioRoutesInfo() {      }      public AudioRoutesInfo(AudioRoutesInfo o) { -        mBluetoothName = o.mBluetoothName; -        mMainType = o.mMainType; +        bluetoothName = o.bluetoothName; +        mainType = o.mainType;      }      AudioRoutesInfo(Parcel src) { -        mBluetoothName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(src); -        mMainType = src.readInt(); +        bluetoothName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(src); +        mainType = src.readInt();      }      @Override @@ -55,8 +55,8 @@ public class AudioRoutesInfo implements Parcelable {      @Override      public void writeToParcel(Parcel dest, int flags) { -        TextUtils.writeToParcel(mBluetoothName, dest, flags); -        dest.writeInt(mMainType); +        TextUtils.writeToParcel(bluetoothName, dest, flags); +        dest.writeInt(mainType);      }      public static final Parcelable.Creator<AudioRoutesInfo> CREATOR diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 70846569d5cc..787320ea0bfc 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -16,7 +16,10 @@  package android.media; +import android.content.Context; +import android.content.pm.PackageManager;  import android.media.audiopolicy.AudioMix; +  import java.util.ArrayList;  /* IF YOU CHANGE ANY OF THE CONSTANTS IN THIS FILE, DO NOT FORGET @@ -65,6 +68,19 @@ public class AudioSystem      private static final int NUM_STREAM_TYPES = 10;      public static final int getNumStreamTypes() { return NUM_STREAM_TYPES; } +    public static final String[] STREAM_NAMES = new String[] { +        "STREAM_VOICE_CALL", +        "STREAM_SYSTEM", +        "STREAM_RING", +        "STREAM_MUSIC", +        "STREAM_ALARM", +        "STREAM_NOTIFICATION", +        "STREAM_BLUETOOTH_SCO", +        "STREAM_SYSTEM_ENFORCED", +        "STREAM_DTMF", +        "STREAM_TTS" +    }; +      /*       * Sets the microphone mute on or off.       * @@ -570,5 +586,93 @@ public class AudioSystem      public static native int getAudioHwSyncForSession(int sessionId);      public static native int registerPolicyMixes(ArrayList<AudioMix> mixes, boolean register); + + +    // Items shared with audio service + +    /** +     * The delay before playing a sound. This small period exists so the user +     * can press another key (non-volume keys, too) to have it NOT be audible. +     * <p> +     * PhoneWindow will implement this part. +     */ +    public static final int PLAY_SOUND_DELAY = 300; + +    /** +     * Constant to identify a focus stack entry that is used to hold the focus while the phone +     * is ringing or during a call. Used by com.android.internal.telephony.CallManager when +     * entering and exiting calls. +     */ +    public final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls"; + +    /** +     * @see AudioManager#setVibrateSetting(int, int) +     */ +    public static int getValueForVibrateSetting(int existingValue, int vibrateType, +            int vibrateSetting) { + +        // First clear the existing setting. Each vibrate type has two bits in +        // the value. Note '3' is '11' in binary. +        existingValue &= ~(3 << (vibrateType * 2)); + +        // Set into the old value +        existingValue |= (vibrateSetting & 3) << (vibrateType * 2); + +        return existingValue; +    } + +    public static int getDefaultStreamVolume(int streamType) { +        return DEFAULT_STREAM_VOLUME[streamType]; +    } + +    public static int[] DEFAULT_STREAM_VOLUME = new int[] { +        4,  // STREAM_VOICE_CALL +        7,  // STREAM_SYSTEM +        5,  // STREAM_RING +        11, // STREAM_MUSIC +        6,  // STREAM_ALARM +        5,  // STREAM_NOTIFICATION +        7,  // STREAM_BLUETOOTH_SCO +        7,  // STREAM_SYSTEM_ENFORCED +        11, // STREAM_DTMF +        11  // STREAM_TTS +    }; + +    public static String streamToString(int stream) { +        if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream]; +        if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE"; +        return "UNKNOWN_STREAM_" + stream; +    } + +    /** The platform has no specific capabilities */ +    public static final int PLATFORM_DEFAULT = 0; +    /** The platform is voice call capable (a phone) */ +    public static final int PLATFORM_VOICE = 1; +    /** The platform is a television or a set-top box */ +    public static final int PLATFORM_TELEVISION = 2; + +    /** +     * Return the platform type that this is running on. One of: +     * <ul> +     * <li>{@link #PLATFORM_VOICE}</li> +     * <li>{@link #PLATFORM_TELEVISION}</li> +     * <li>{@link #PLATFORM_DEFAULT}</li> +     * </ul> +     */ +    public static int getPlatformType(Context context) { +        if (context.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable)) { +            return PLATFORM_VOICE; +        } else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) { +            return PLATFORM_TELEVISION; +        } else { +            return PLATFORM_DEFAULT; +        } +    } + +    public static final int DEFAULT_MUTE_STREAMS_AFFECTED = +            (1 << STREAM_MUSIC) | +            (1 << STREAM_RING) | +            (1 << STREAM_NOTIFICATION) | +            (1 << STREAM_SYSTEM);  } diff --git a/media/java/android/media/ClosedCaptionRenderer.java b/media/java/android/media/ClosedCaptionRenderer.java index d34b21bad14a..e3680e97363e 100644 --- a/media/java/android/media/ClosedCaptionRenderer.java +++ b/media/java/android/media/ClosedCaptionRenderer.java @@ -154,6 +154,7 @@ class CCParser {      private int mMode = MODE_PAINT_ON;      private int mRollUpSize = 4; +    private int mPrevCtrlCode = INVALID;      private CCMemory mDisplay = new CCMemory();      private CCMemory mNonDisplay = new CCMemory(); @@ -260,6 +261,13 @@ class CCParser {      private boolean handleCtrlCode(CCData ccData) {          int ctrlCode = ccData.getCtrlCode(); + +        if (mPrevCtrlCode != INVALID && mPrevCtrlCode == ctrlCode) { +            // discard double ctrl codes (but if there's a 3rd one, we still take that) +            mPrevCtrlCode = INVALID; +            return true; +        } +          switch(ctrlCode) {          case RCL:              // select pop-on style @@ -325,10 +333,12 @@ class CCParser {              break;          case INVALID:          default: -            // not handled +            mPrevCtrlCode = INVALID;              return false;          } +        mPrevCtrlCode = ctrlCode; +          // handled          return true;      } diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 958ffab3c39d..5285074d8298 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -171,15 +171,15 @@ public class MediaRouter {          }          void updateAudioRoutes(AudioRoutesInfo newRoutes) { -            if (newRoutes.mMainType != mCurAudioRoutesInfo.mMainType) { -                mCurAudioRoutesInfo.mMainType = newRoutes.mMainType; +            if (newRoutes.mainType != mCurAudioRoutesInfo.mainType) { +                mCurAudioRoutesInfo.mainType = newRoutes.mainType;                  int name; -                if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_HEADPHONES) != 0 -                        || (newRoutes.mMainType&AudioRoutesInfo.MAIN_HEADSET) != 0) { +                if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HEADPHONES) != 0 +                        || (newRoutes.mainType&AudioRoutesInfo.MAIN_HEADSET) != 0) {                      name = com.android.internal.R.string.default_audio_route_name_headphones; -                } else if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) { +                } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_DOCK_SPEAKERS) != 0) {                      name = com.android.internal.R.string.default_audio_route_name_dock_speakers; -                } else if ((newRoutes.mMainType&AudioRoutesInfo.MAIN_HDMI) != 0) { +                } else if ((newRoutes.mainType&AudioRoutesInfo.MAIN_HDMI) != 0) {                      name = com.android.internal.R.string.default_media_route_name_hdmi;                  } else {                      name = com.android.internal.R.string.default_audio_route_name; @@ -188,21 +188,21 @@ public class MediaRouter {                  dispatchRouteChanged(sStatic.mDefaultAudioVideo);              } -            final int mainType = mCurAudioRoutesInfo.mMainType; +            final int mainType = mCurAudioRoutesInfo.mainType; -            if (!TextUtils.equals(newRoutes.mBluetoothName, mCurAudioRoutesInfo.mBluetoothName)) { -                mCurAudioRoutesInfo.mBluetoothName = newRoutes.mBluetoothName; -                if (mCurAudioRoutesInfo.mBluetoothName != null) { +            if (!TextUtils.equals(newRoutes.bluetoothName, mCurAudioRoutesInfo.bluetoothName)) { +                mCurAudioRoutesInfo.bluetoothName = newRoutes.bluetoothName; +                if (mCurAudioRoutesInfo.bluetoothName != null) {                      if (sStatic.mBluetoothA2dpRoute == null) {                          final RouteInfo info = new RouteInfo(sStatic.mSystemCategory); -                        info.mName = mCurAudioRoutesInfo.mBluetoothName; +                        info.mName = mCurAudioRoutesInfo.bluetoothName;                          info.mDescription = sStatic.mResources.getText(                                  com.android.internal.R.string.bluetooth_a2dp_audio_route_name);                          info.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO;                          sStatic.mBluetoothA2dpRoute = info;                          addRouteStatic(sStatic.mBluetoothA2dpRoute);                      } else { -                        sStatic.mBluetoothA2dpRoute.mName = mCurAudioRoutesInfo.mBluetoothName; +                        sStatic.mBluetoothA2dpRoute.mName = mCurAudioRoutesInfo.bluetoothName;                          dispatchRouteChanged(sStatic.mBluetoothA2dpRoute);                      }                  } else if (sStatic.mBluetoothA2dpRoute != null) { diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index a8b91d24c5a9..a73209bf1979 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -484,6 +484,7 @@ static status_t decode(int fd, int64_t offset, int64_t length,      status_t err = AMediaExtractor_setDataSourceFd(ex, fd, offset, length);      if (err != AMEDIA_OK) { +        AMediaExtractor_delete(ex);          return err;      } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java index dfea166fba80..845d53a19213 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java @@ -90,9 +90,11 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView          post(new Runnable() {              @Override              public void run() { -                mPasswordEntry.requestFocus(); -                if (reason != KeyguardSecurityView.SCREEN_ON || mShowImeAtScreenOn) { -                    mImm.showSoftInput(mPasswordEntry, InputMethodManager.SHOW_IMPLICIT); +                if (isShown()) { +                    mPasswordEntry.requestFocus(); +                    if (reason != KeyguardSecurityView.SCREEN_ON || mShowImeAtScreenOn) { +                        mImm.showSoftInput(mPasswordEntry, InputMethodManager.SHOW_IMPLICIT); +                    }                  }              }          }); diff --git a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java index 6497f461a14f..67ddcfaa2041 100644 --- a/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java +++ b/packages/Keyguard/src/com/android/keyguard/PasswordTextView.java @@ -28,9 +28,15 @@ import android.graphics.Rect;  import android.graphics.Typeface;  import android.os.PowerManager;  import android.os.SystemClock; +import android.os.UserHandle;  import android.provider.Settings; +import android.text.InputType; +import android.text.TextUtils;  import android.util.AttributeSet;  import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo;  import android.view.animation.AnimationUtils;  import android.view.animation.Interpolator; @@ -176,6 +182,7 @@ public class PasswordTextView extends View {      public void append(char c) {          int visibleChars = mTextChars.size(); +        String textbefore = mText;          mText = mText + c;          int newLength = mText.length();          CharState charState; @@ -196,6 +203,7 @@ public class PasswordTextView extends View {              }          }          userActivity(); +        sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length(), 0, 1);      }      private void userActivity() { @@ -204,12 +212,14 @@ public class PasswordTextView extends View {      public void deleteLastChar() {          int length = mText.length(); +        String textbefore = mText;          if (length > 0) {              mText = mText.substring(0, length - 1);              CharState charState = mTextChars.get(length - 1);              charState.startRemoveAnimation(0, 0);          }          userActivity(); +        sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length() - 1, 1, 0);      }      public String getText() { @@ -229,6 +239,7 @@ public class PasswordTextView extends View {      }      public void reset(boolean animated) { +        String textbefore = mText;          mText = "";          int length = mTextChars.size();          int middleIndex = (length - 1) / 2; @@ -256,6 +267,71 @@ public class PasswordTextView extends View {          if (!animated) {              mTextChars.clear();          } +        sendAccessibilityEventTypeViewTextChanged(textbefore, 0, textbefore.length(), 0); +    } + +    void sendAccessibilityEventTypeViewTextChanged(String beforeText, int fromIndex, +                                                   int removedCount, int addedCount) { +        if (AccessibilityManager.getInstance(mContext).isEnabled() && +                (isFocused() || isSelected() && isShown())) { +            if (!shouldSpeakPasswordsForAccessibility()) { +                beforeText = null; +            } +            AccessibilityEvent event = +                    AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); +            event.setFromIndex(fromIndex); +            event.setRemovedCount(removedCount); +            event.setAddedCount(addedCount); +            event.setBeforeText(beforeText); +            event.setPassword(true); +            sendAccessibilityEventUnchecked(event); +        } +    } + +    @Override +    public void onInitializeAccessibilityEvent(AccessibilityEvent event) { +        super.onInitializeAccessibilityEvent(event); + +        event.setClassName(PasswordTextView.class.getName()); +        event.setPassword(true); +    } + +    @Override +    public void onPopulateAccessibilityEvent(AccessibilityEvent event) { +        super.onPopulateAccessibilityEvent(event); + +        if (shouldSpeakPasswordsForAccessibility()) { +            final CharSequence text = mText; +            if (!TextUtils.isEmpty(text)) { +                event.getText().add(text); +            } +        } +    } + +    @Override +    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { +        super.onInitializeAccessibilityNodeInfo(info); + +        info.setClassName(PasswordTextView.class.getName()); +        info.setPassword(true); + +        if (shouldSpeakPasswordsForAccessibility()) { +            info.setText(mText); +        } + +        info.setEditable(true); + +        info.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD); +    } + +    /** +     * @return true if the user has explicitly allowed accessibility services +     * to speak passwords. +     */ +    private boolean shouldSpeakPasswordsForAccessibility() { +        return (Settings.Secure.getIntForUser(mContext.getContentResolver(), +                Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0, +                UserHandle.USER_CURRENT_OR_SELF) == 1);      }      private class CharState { diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml index 923a38ca88fd..169710a9e9af 100644 --- a/packages/PrintSpooler/res/values-af/strings.xml +++ b/packages/PrintSpooler/res/values-af/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papiergrootte"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papiergrootte:"</string>      <string name="label_color" msgid="1108690305218188969">"Kleur"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dupleks"</string>      <string name="label_orientation" msgid="2853142581990496477">"Oriëntasie"</string>      <string name="label_pages" msgid="7768589729282182230">"Bladsye"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Al <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 8f4624970b5c..7d9b5f30694b 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"የወረቀት መጠን"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"የወረቀት መጠን፦"</string>      <string name="label_color" msgid="1108690305218188969">"ቀለም"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"አቀማመጠ ገፅ"</string>      <string name="label_pages" msgid="7768589729282182230">"ገፆች"</string>      <string name="template_all_pages" msgid="3322235982020148762">"ሁሉም <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index 9f931d5ddf0c..217d0706cbf7 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"حجم الورق"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"حجم الورق:"</string>      <string name="label_color" msgid="1108690305218188969">"ألوان"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"مزدوج"</string>      <string name="label_orientation" msgid="2853142581990496477">"الاتجاه"</string>      <string name="label_pages" msgid="7768589729282182230">"الصفحات"</string>      <string name="template_all_pages" msgid="3322235982020148762">"جميع الصفحات وعددها <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml index 981b4c10d654..c84f47de20cf 100644 --- a/packages/PrintSpooler/res/values-bg/strings.xml +++ b/packages/PrintSpooler/res/values-bg/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Размер на хартията"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Размер на хартията:"</string>      <string name="label_color" msgid="1108690305218188969">"Цвят"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Двустранен режим"</string>      <string name="label_orientation" msgid="2853142581990496477">"Ориентация"</string>      <string name="label_pages" msgid="7768589729282182230">"Страници"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Всички <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-bn-rBD/strings.xml b/packages/PrintSpooler/res/values-bn-rBD/strings.xml index 4d74ceb75b8a..6e03179c409d 100644 --- a/packages/PrintSpooler/res/values-bn-rBD/strings.xml +++ b/packages/PrintSpooler/res/values-bn-rBD/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"কাগজের আকার"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"কাগজের আকার:"</string>      <string name="label_color" msgid="1108690305218188969">"রঙ"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"দ্বৈত"</string>      <string name="label_orientation" msgid="2853142581990496477">"সজ্জা"</string>      <string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাগুলি"</string>      <string name="template_all_pages" msgid="3322235982020148762">"সমস্ত <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"কালো এবং সাদা"</item>      <item msgid="2762241247228983754">"রঙ"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"কোনো কিছুই নয়"</item> +    <item msgid="7296563835355641719">"দীর্ঘ প্রান্ত"</item> +    <item msgid="79513688117503758">"সংক্ষিপ্ত প্রান্ত"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"প্রতিকৃতি"</item>      <item msgid="3199660090246166812">"ভূদৃশ্য"</item> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index ca7bafa39fb6..0ecaf1a0ac13 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Mida del paper"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Mida del paper:"</string>      <string name="label_color" msgid="1108690305218188969">"Color"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dúplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientació"</string>      <string name="label_pages" msgid="7768589729282182230">"Pàgines"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Totes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml index 77f338aeae87..f26c21c0b703 100644 --- a/packages/PrintSpooler/res/values-cs/strings.xml +++ b/packages/PrintSpooler/res/values-cs/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Velikost papíru"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Velikost papíru:"</string>      <string name="label_color" msgid="1108690305218188969">"Barva"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Oboustranně"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientace"</string>      <string name="label_pages" msgid="7768589729282182230">"Stránky"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Vše: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml index b497c1864f40..339485a6717f 100644 --- a/packages/PrintSpooler/res/values-da/strings.xml +++ b/packages/PrintSpooler/res/values-da/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papirstørrelse"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papirstørrelse:"</string>      <string name="label_color" msgid="1108690305218188969">"Farve"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Retning"</string>      <string name="label_pages" msgid="7768589729282182230">"Sider"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml index 1b9ce0937972..d1ff80af7f53 100644 --- a/packages/PrintSpooler/res/values-de/strings.xml +++ b/packages/PrintSpooler/res/values-de/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papierformat"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papierformat:"</string>      <string name="label_color" msgid="1108690305218188969">"Farbe"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Ausrichtung"</string>      <string name="label_pages" msgid="7768589729282182230">"Seiten"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml index 2908b6ace74e..71814025e5c9 100644 --- a/packages/PrintSpooler/res/values-el/strings.xml +++ b/packages/PrintSpooler/res/values-el/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Μεγέθος χαρτιού"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Μέγεθος χαρτιού:"</string>      <string name="label_color" msgid="1108690305218188969">"Χρώμα"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Δύο πλευρές"</string>      <string name="label_orientation" msgid="2853142581990496477">"Προσανατολισμός"</string>      <string name="label_pages" msgid="7768589729282182230">"Σελίδες"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Και οι <xliff:g id="PAGE_COUNT">%1$s</xliff:g> σελίδες"</string> diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml index 5fa53387f95b..56b97b9ff065 100644 --- a/packages/PrintSpooler/res/values-en-rGB/strings.xml +++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Paper size"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Paper size:"</string>      <string name="label_color" msgid="1108690305218188969">"Colour"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>      <string name="label_pages" msgid="7768589729282182230">"Pages"</string>      <string name="template_all_pages" msgid="3322235982020148762">"All <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml index 5fa53387f95b..56b97b9ff065 100644 --- a/packages/PrintSpooler/res/values-en-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Paper size"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Paper size:"</string>      <string name="label_color" msgid="1108690305218188969">"Colour"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>      <string name="label_pages" msgid="7768589729282182230">"Pages"</string>      <string name="template_all_pages" msgid="3322235982020148762">"All <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 17ea7099bf86..0229b9c80a44 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Tamaño del papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño de papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Color"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Doble faz"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>      <string name="label_pages" msgid="7768589729282182230">"Páginas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Todas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index c5971778ca29..87ecfe9d7d93 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Tamaño del papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño del papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Color"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Doble cara"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>      <string name="label_pages" msgid="7768589729282182230">"Páginas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Todas (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml index 5e300da6516f..5ee0070b7124 100644 --- a/packages/PrintSpooler/res/values-et-rEE/strings.xml +++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Paberi suurus"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Paberi suurus:"</string>      <string name="label_color" msgid="1108690305218188969">"Värv"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dupleksrežiim"</string>      <string name="label_orientation" msgid="2853142581990496477">"Suund"</string>      <string name="label_pages" msgid="7768589729282182230">"Lehed"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Kõik <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml index 4e79c6095fd5..4357bf46ebd1 100644 --- a/packages/PrintSpooler/res/values-eu-rES/strings.xml +++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Paperaren tamaina"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Paperaren tamaina:"</string>      <string name="label_color" msgid="1108690305218188969">"Koloretan"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Bikoitza"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientazioa"</string>      <string name="label_pages" msgid="7768589729282182230">"Orriak"</string>      <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> orriak"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Zuri-beltza"</item>      <item msgid="2762241247228983754">"Koloretakoa"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Bat ere ez"</item> +    <item msgid="7296563835355641719">"Ertz luzetik"</item> +    <item msgid="79513688117503758">"Ertz laburretik"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Bertikala"</item>      <item msgid="3199660090246166812">"Horizontala"</item> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 1bc934e9f1c1..e20505048592 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"اندازه کاغذ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"اندازه کاغذ:"</string>      <string name="label_color" msgid="1108690305218188969">"رنگی"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"دوبلکس"</string>      <string name="label_orientation" msgid="2853142581990496477">"جهت"</string>      <string name="label_pages" msgid="7768589729282182230">"صفحهها"</string>      <string name="template_all_pages" msgid="3322235982020148762">"همه <xliff:g id="PAGE_COUNT">%1$s</xliff:g> صفحه"</string> diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml index 87dd636bb8f5..8af0bb47f09f 100644 --- a/packages/PrintSpooler/res/values-fi/strings.xml +++ b/packages/PrintSpooler/res/values-fi/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Paperikoko"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Paperikoko:"</string>      <string name="label_color" msgid="1108690305218188969">"Väri"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Suunta"</string>      <string name="label_pages" msgid="7768589729282182230">"Sivut"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Kaikki <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index fe038fd7ebcf..ed605e891a07 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Taille du papier"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Taille du papier :"</string>      <string name="label_color" msgid="1108690305218188969">"Couleur"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>      <string name="label_pages" msgid="7768589729282182230">"Pages"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Toutes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index 23aaf51f8f97..a88b3f2ca6c4 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Taille du papier"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Taille du papier :"</string>      <string name="label_color" msgid="1108690305218188969">"Couleur"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Recto verso"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string>      <string name="label_pages" msgid="7768589729282182230">"Pages"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Toutes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-gl-rES/strings.xml b/packages/PrintSpooler/res/values-gl-rES/strings.xml index ba8432f74341..c5a271aa65c9 100644 --- a/packages/PrintSpooler/res/values-gl-rES/strings.xml +++ b/packages/PrintSpooler/res/values-gl-rES/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Tamaño do papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Tamaño do papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Cor"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dobre cara"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientación"</string>      <string name="label_pages" msgid="7768589729282182230">"Páxinas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"As <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Branco e negro"</item>      <item msgid="2762241247228983754">"Cor"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Ningún"</item> +    <item msgid="7296563835355641719">"Bordo longo"</item> +    <item msgid="79513688117503758">"Bordo curto"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Vertical"</item>      <item msgid="3199660090246166812">"Horizontal"</item> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index b39efcb9aac7..6bf4aa8bd503 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"काग़ज़ का आकार"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"काग़ज़ का आकार:"</string>      <string name="label_color" msgid="1108690305218188969">"रंग"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"डुप्लेक्स"</string>      <string name="label_orientation" msgid="2853142581990496477">"अभिविन्यास"</string>      <string name="label_pages" msgid="7768589729282182230">"पृष्ठ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"सभी <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml index 7e68f0919086..eddff9af77cb 100644 --- a/packages/PrintSpooler/res/values-hr/strings.xml +++ b/packages/PrintSpooler/res/values-hr/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Veličina papira"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Veličina papira:"</string>      <string name="label_color" msgid="1108690305218188969">"U boji"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Obostrano"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orijentacija"</string>      <string name="label_pages" msgid="7768589729282182230">"Stranice"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Sve stranice (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml index 10b351d53568..08a36b3bca00 100644 --- a/packages/PrintSpooler/res/values-hu/strings.xml +++ b/packages/PrintSpooler/res/values-hu/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papírméret"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papírméret:"</string>      <string name="label_color" msgid="1108690305218188969">"Szín"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Kétoldalas"</string>      <string name="label_orientation" msgid="2853142581990496477">"Tájolás"</string>      <string name="label_pages" msgid="7768589729282182230">"Oldalak"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Összes (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml index 08cb138ec7cd..593660735c46 100644 --- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml +++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Թղթի չափը"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Թղթի չափը՝"</string>      <string name="label_color" msgid="1108690305218188969">"Գույնը"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Երկակի"</string>      <string name="label_orientation" msgid="2853142581990496477">"Դիրքավորում"</string>      <string name="label_pages" msgid="7768589729282182230">"Էջեր"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Բոլորը՝ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml index 666442cbc670..ab30df107334 100644 --- a/packages/PrintSpooler/res/values-in/strings.xml +++ b/packages/PrintSpooler/res/values-in/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Ukuran kertas"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Ukuran kertas:"</string>      <string name="label_color" msgid="1108690305218188969">"Warna"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dupleks"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>      <string name="label_pages" msgid="7768589729282182230">"Halaman"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Semua dari <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-is-rIS/strings.xml b/packages/PrintSpooler/res/values-is-rIS/strings.xml index bb0c7ca0ab17..c6422b1dac0f 100644 --- a/packages/PrintSpooler/res/values-is-rIS/strings.xml +++ b/packages/PrintSpooler/res/values-is-rIS/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Pappírsstærð"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Pappírsstærð:"</string>      <string name="label_color" msgid="1108690305218188969">"Litur"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Tvíhliða"</string>      <string name="label_orientation" msgid="2853142581990496477">"Stefna"</string>      <string name="label_pages" msgid="7768589729282182230">"Síður"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Allar <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Svarthvítt"</item>      <item msgid="2762241247228983754">"Í lit"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Ekki í boði"</item> +    <item msgid="7296563835355641719">"Langhlið"</item> +    <item msgid="79513688117503758">"Skammhlið"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Skammsnið"</item>      <item msgid="3199660090246166812">"Langsnið"</item> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 39043ee31c12..9544ba7fb935 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Dimensioni carta"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Dimensioni carta:"</string>      <string name="label_color" msgid="1108690305218188969">"A colori"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Due tonalità (Duplex)"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientamento"</string>      <string name="label_pages" msgid="7768589729282182230">"Pagine"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Tutte e <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 1fd68e91bee3..e3e612324756 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"גודל נייר"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"גודל נייר:"</string>      <string name="label_color" msgid="1108690305218188969">"צבע"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"דו-צדדי"</string>      <string name="label_orientation" msgid="2853142581990496477">"כיוון"</string>      <string name="label_pages" msgid="7768589729282182230">"עמודים"</string>      <string name="template_all_pages" msgid="3322235982020148762">"הכל <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index 3cc7e8ea644a..a433d5181502 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"用紙サイズ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"用紙サイズ:"</string>      <string name="label_color" msgid="1108690305218188969">"カラー選択"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"両面印刷"</string>      <string name="label_orientation" msgid="2853142581990496477">"方向"</string>      <string name="label_pages" msgid="7768589729282182230">"ページ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ページすべて"</string> diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml index 4a55dfe10962..6edd2f3c81db 100644 --- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml +++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"ფურცლის ზომა"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"ფურცლის ზომა:"</string>      <string name="label_color" msgid="1108690305218188969">"ფერი"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"დუპლექსი"</string>      <string name="label_orientation" msgid="2853142581990496477">"ორიენტაცია"</string>      <string name="label_pages" msgid="7768589729282182230">"გვერდები"</string>      <string name="template_all_pages" msgid="3322235982020148762">"ყველა <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml index 362d790840e1..13dfa04cb447 100644 --- a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml +++ b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Қағаз өлшемі"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Қағаз өлшемі:"</string>      <string name="label_color" msgid="1108690305218188969">"Түс"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Дуплексті"</string>      <string name="label_orientation" msgid="2853142581990496477">"Бағыты"</string>      <string name="label_pages" msgid="7768589729282182230">"Беттер"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Барлық <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Қара & Ақ"</item>      <item msgid="2762241247228983754">"Түс"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Ешқандай"</item> +    <item msgid="7296563835355641719">"Ұзын жиек"</item> +    <item msgid="79513688117503758">"Қысқа жиек"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Портреттік"</item>      <item msgid="3199660090246166812">"Ландшафт"</item> diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml index 9bc3362df324..2777b7e17187 100644 --- a/packages/PrintSpooler/res/values-km-rKH/strings.xml +++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"ទំហំក្រដាស"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"ទំហំក្រដាស៖"</string>      <string name="label_color" msgid="1108690305218188969">"ពណ៌"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ឌុប"</string>      <string name="label_orientation" msgid="2853142581990496477">"ទិស"</string>      <string name="label_pages" msgid="7768589729282182230">"ទំព័រ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> ទាំងអស់"</string> diff --git a/packages/PrintSpooler/res/values-kn-rIN/strings.xml b/packages/PrintSpooler/res/values-kn-rIN/strings.xml index 61065e0fa54d..15bc98b21664 100644 --- a/packages/PrintSpooler/res/values-kn-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-kn-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"ಪೇಪರ್ ಗಾತ್ರ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"ಪೇಪರ್ ಗಾತ್ರ:"</string>      <string name="label_color" msgid="1108690305218188969">"ಬಣ್ಣ"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ಡ್ಯೂಪ್ಲೆಕ್ಸ್"</string>      <string name="label_orientation" msgid="2853142581990496477">"ಓರಿಯಂಟೇಶನ್"</string>      <string name="label_pages" msgid="7768589729282182230">"ಪುಟಗಳು"</string>      <string name="template_all_pages" msgid="3322235982020148762">"ಎಲ್ಲಾ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"ಕಪ್ಪು & ಬಿಳುಪು"</item>      <item msgid="2762241247228983754">"ಬಣ್ಣ"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"ಯಾವುದೂ ಇಲ್ಲ"</item> +    <item msgid="7296563835355641719">"ಉದ್ದವಾದ ಅಂಚು"</item> +    <item msgid="79513688117503758">"ಚಿಕ್ಕದಾದ ಅಂಚು"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"ಪೋಟ್ರೇಟ್"</item>      <item msgid="3199660090246166812">"ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್"</item> diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml index 448896c18990..6db4cce6e905 100644 --- a/packages/PrintSpooler/res/values-ko/strings.xml +++ b/packages/PrintSpooler/res/values-ko/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"용지 크기"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"용지 크기:"</string>      <string name="label_color" msgid="1108690305218188969">"색상"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"양면"</string>      <string name="label_orientation" msgid="2853142581990496477">"방향"</string>      <string name="label_pages" msgid="7768589729282182230">"페이지"</string>      <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>페이지 모두"</string> diff --git a/packages/PrintSpooler/res/values-ky-rKG/strings.xml b/packages/PrintSpooler/res/values-ky-rKG/strings.xml index 64bd5853813e..6a989de53142 100644 --- a/packages/PrintSpooler/res/values-ky-rKG/strings.xml +++ b/packages/PrintSpooler/res/values-ky-rKG/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Барактын өлчөмү"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Барактын өлчөмү:"</string>      <string name="label_color" msgid="1108690305218188969">"Түс"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Кош тараптуу"</string>      <string name="label_orientation" msgid="2853142581990496477">"Багыттоо"</string>      <string name="label_pages" msgid="7768589729282182230">"Баракчалар"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Бардыгы <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Кара-ак"</item>      <item msgid="2762241247228983754">"Түстүү"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Эч бири"</item> +    <item msgid="7296563835355641719">"Узун кыр"</item> +    <item msgid="79513688117503758">"Кыска кыр"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Тикесинен"</item>      <item msgid="3199660090246166812">"Туурасынан"</item> diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml index 9bd4d83bd6c4..20a3d8023e3f 100644 --- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml +++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"ຂະໜາດເຈ້ຍ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"ຂະໜາດເຈ້ຍ:"</string>      <string name="label_color" msgid="1108690305218188969">"ສີ"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ສອງໜ້າ"</string>      <string name="label_orientation" msgid="2853142581990496477">"ລວງ"</string>      <string name="label_pages" msgid="7768589729282182230">"ໜ້າ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"ທັງໝົດ <xliff:g id="PAGE_COUNT">%1$s</xliff:g> ໜ້າ"</string> diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml index 1116f6de9277..734090649a53 100644 --- a/packages/PrintSpooler/res/values-lt/strings.xml +++ b/packages/PrintSpooler/res/values-lt/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Popieriaus dydis"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Popieriaus dydis:"</string>      <string name="label_color" msgid="1108690305218188969">"Spalva"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dvipusis"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientacija"</string>      <string name="label_pages" msgid="7768589729282182230">"Puslapiai"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Visi <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml index d079ea999f78..2fb6a1a8d953 100644 --- a/packages/PrintSpooler/res/values-lv/strings.xml +++ b/packages/PrintSpooler/res/values-lv/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papīra izmērs"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papīra izmērs:"</string>      <string name="label_color" msgid="1108690305218188969">"Krāsa"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dubults"</string>      <string name="label_orientation" msgid="2853142581990496477">"Virziens"</string>      <string name="label_pages" msgid="7768589729282182230">"Lapas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Visas <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-mk-rMK/strings.xml b/packages/PrintSpooler/res/values-mk-rMK/strings.xml index fec4841b797d..bf2e2627c935 100644 --- a/packages/PrintSpooler/res/values-mk-rMK/strings.xml +++ b/packages/PrintSpooler/res/values-mk-rMK/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Големина на хартија"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Големина на хартија:"</string>      <string name="label_color" msgid="1108690305218188969">"Боја"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Двострано"</string>      <string name="label_orientation" msgid="2853142581990496477">"Ориентација"</string>      <string name="label_pages" msgid="7768589729282182230">"Страници"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Сите <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Црно-бела"</item>      <item msgid="2762241247228983754">"Во боја"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Нема"</item> +    <item msgid="7296563835355641719">"Долг раб"</item> +    <item msgid="79513688117503758">"Краток раб"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Портрет"</item>      <item msgid="3199660090246166812">"Пејзаж"</item> diff --git a/packages/PrintSpooler/res/values-ml-rIN/strings.xml b/packages/PrintSpooler/res/values-ml-rIN/strings.xml index 743827f77ca2..26d178883747 100644 --- a/packages/PrintSpooler/res/values-ml-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ml-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"പേപ്പർ വലുപ്പം"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"പേപ്പർ വലുപ്പം:"</string>      <string name="label_color" msgid="1108690305218188969">"നിറം"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"രണ്ടുഭാഗങ്ങളുള്ളത്"</string>      <string name="label_orientation" msgid="2853142581990496477">"ഓറിയന്റേഷന്"</string>      <string name="label_pages" msgid="7768589729282182230">"പേജുകൾ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"എല്ലാ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"കറുപ്പ് & വെള്ള"</item>      <item msgid="2762241247228983754">"നിറം"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"ഒന്നുമില്ല"</item> +    <item msgid="7296563835355641719">"നീളമുള്ള അരിക്"</item> +    <item msgid="79513688117503758">"ഹ്രസ്വ അരിക്"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"പോർട്രെയ്റ്റ്"</item>      <item msgid="3199660090246166812">"ലാൻഡ്സ്കേപ്പ്"</item> diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml index 8d0604aa39c9..34da68340c7d 100644 --- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml +++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Цаасны хэмжээ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Цаасны хэмжээ:"</string>      <string name="label_color" msgid="1108690305218188969">"Өнгө"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Хоёр талд нь хэвлэх"</string>      <string name="label_orientation" msgid="2853142581990496477">"Чиглэл"</string>      <string name="label_pages" msgid="7768589729282182230">"Хуудас"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Нийт <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-mr-rIN/strings.xml b/packages/PrintSpooler/res/values-mr-rIN/strings.xml index 9036e0ec6f34..d2aa367037ab 100644 --- a/packages/PrintSpooler/res/values-mr-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-mr-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"कागद आकार"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"कागद आकार:"</string>      <string name="label_color" msgid="1108690305218188969">"रंग"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"डुप्लेक्स"</string>      <string name="label_orientation" msgid="2853142581990496477">"अभिमुखता"</string>      <string name="label_pages" msgid="7768589729282182230">"पृष्ठे"</string>      <string name="template_all_pages" msgid="3322235982020148762">"सर्व <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"कृष्ण धवल"</item>      <item msgid="2762241247228983754">"रंग"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"काहीही नाही"</item> +    <item msgid="7296563835355641719">"दीर्घ किनार"</item> +    <item msgid="79513688117503758">"लघु किनार"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"पोट्रेट"</item>      <item msgid="3199660090246166812">"भूदृश्य"</item> diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml index 0c7ecfb02d34..6b0754c6f084 100644 --- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml +++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Saiz kertas"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Saiz kertas:"</string>      <string name="label_color" msgid="1108690305218188969">"Warna"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dupleks"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientasi"</string>      <string name="label_pages" msgid="7768589729282182230">"Halaman"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Semua <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-my-rMM/strings.xml b/packages/PrintSpooler/res/values-my-rMM/strings.xml index bbf2de48d8d4..c87eca1d16c6 100644 --- a/packages/PrintSpooler/res/values-my-rMM/strings.xml +++ b/packages/PrintSpooler/res/values-my-rMM/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"စက္ကူ  ဆိုက်"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"စက္ကူ  ဆိုက်:"</string>      <string name="label_color" msgid="1108690305218188969">"ရောင်စုံ"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ဂျူးပလက်စ်"</string>      <string name="label_orientation" msgid="2853142581990496477">"အနေအထား"</string>      <string name="label_pages" msgid="7768589729282182230">"စာမျက်နှာများ"</string>      <string name="template_all_pages" msgid="3322235982020148762">"အားလုံး <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"အဖြူ အမည်း"</item>      <item msgid="2762241247228983754">"ရောင်စုံ"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"မရှိ"</item> +    <item msgid="7296563835355641719">"အနားသတ် အရှည်"</item> +    <item msgid="79513688117503758">"အနားသတ် အတို"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"ထောင်လိုက်"</item>      <item msgid="3199660090246166812">"အလျားလိုက်"</item> diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml index 1df90a9624af..441444e5533e 100644 --- a/packages/PrintSpooler/res/values-nb/strings.xml +++ b/packages/PrintSpooler/res/values-nb/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papirstørrelse"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papirstørrelse:"</string>      <string name="label_color" msgid="1108690305218188969">"Farge"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Retning"</string>      <string name="label_pages" msgid="7768589729282182230">"Sider"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ne-rNP/strings.xml b/packages/PrintSpooler/res/values-ne-rNP/strings.xml index c2ecc3bdebb9..dd20bbbd094b 100644 --- a/packages/PrintSpooler/res/values-ne-rNP/strings.xml +++ b/packages/PrintSpooler/res/values-ne-rNP/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"कागजको आकार"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"कागजको आकार:"</string>      <string name="label_color" msgid="1108690305218188969">"रङ्ग"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"डुप्लेक्स"</string>      <string name="label_orientation" msgid="2853142581990496477">"अभिमुखिकरण"</string>      <string name="label_pages" msgid="7768589729282182230">"पृष्ठहरू"</string>      <string name="template_all_pages" msgid="3322235982020148762">"सबै <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 2a6c4c20e8c4..31c0110c96f0 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Papierformaat"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Papierformaat:"</string>      <string name="label_color" msgid="1108690305218188969">"Kleur"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Stand"</string>      <string name="label_pages" msgid="7768589729282182230">"Pagina\'s"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Alle <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml index a74a89095507..ccba0d5391a3 100644 --- a/packages/PrintSpooler/res/values-pl/strings.xml +++ b/packages/PrintSpooler/res/values-pl/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Rozmiar papieru"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Rozmiar papieru:"</string>      <string name="label_color" msgid="1108690305218188969">"Kolor"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dupleks"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientacja"</string>      <string name="label_pages" msgid="7768589729282182230">"Strony"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Wszystkie <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index 10b32ca63f13..5efa1d73f06d 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Tamanho do papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Tamanho do papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Cor"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Frente e verso"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>      <string name="label_pages" msgid="7768589729282182230">"Páginas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Todas as <xliff:g id="PAGE_COUNT">%1$s</xliff:g> páginas"</string> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index eb1d9a0eeca6..52875dd91c63 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Tamanho do papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Tamanho do papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Cor"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientação"</string>      <string name="label_pages" msgid="7768589729282182230">"Páginas"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Todas as <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index 15ccb7dbcacd..98d3761f98e1 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Formatul hârtiei"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Formatul hârtiei:"</string>      <string name="label_color" msgid="1108690305218188969">"Color"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientare"</string>      <string name="label_pages" msgid="7768589729282182230">"Pagini"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Toate cele <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index f2d5bef3aede..4d9861aef30e 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Размер бумаги"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Размер бумаги:"</string>      <string name="label_color" msgid="1108690305218188969">"Печать"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Двусторонняя печать"</string>      <string name="label_orientation" msgid="2853142581990496477">"Ориентация"</string>      <string name="label_pages" msgid="7768589729282182230">"Страницы"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Все <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-si-rLK/strings.xml b/packages/PrintSpooler/res/values-si-rLK/strings.xml index f1b40c64ad3d..a3518e11e651 100644 --- a/packages/PrintSpooler/res/values-si-rLK/strings.xml +++ b/packages/PrintSpooler/res/values-si-rLK/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"කඩදාසියේ ප්රමාණය"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"කඩදාසියේ ප්රමාණය:"</string>      <string name="label_color" msgid="1108690305218188969">"වර්ණය"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"දෙපත්"</string>      <string name="label_orientation" msgid="2853142581990496477">"දිශානතිය"</string>      <string name="label_pages" msgid="7768589729282182230">"පිටු"</string>      <string name="template_all_pages" msgid="3322235982020148762">"සියලුම <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml index fbf2bc70dd33..ecb70b844dea 100644 --- a/packages/PrintSpooler/res/values-sk/strings.xml +++ b/packages/PrintSpooler/res/values-sk/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Veľkosť papiera"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Veľkosť papiera:"</string>      <string name="label_color" msgid="1108690305218188969">"Farba"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientácia"</string>      <string name="label_pages" msgid="7768589729282182230">"Strany"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Všetky: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml index a441d7c31561..c94429e4f701 100644 --- a/packages/PrintSpooler/res/values-sl/strings.xml +++ b/packages/PrintSpooler/res/values-sl/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Velikost papirja"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Velikost papirja:"</string>      <string name="label_color" msgid="1108690305218188969">"Barvno"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Obojestransko"</string>      <string name="label_orientation" msgid="2853142581990496477">"Postavitev"</string>      <string name="label_pages" msgid="7768589729282182230">"Strani"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Vse (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index 622c84bebd47..7bc912cc2cfe 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Величина папира"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Величина папира:"</string>      <string name="label_color" msgid="1108690305218188969">"Боја"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Обострани режим"</string>      <string name="label_orientation" msgid="2853142581990496477">"Положај"</string>      <string name="label_pages" msgid="7768589729282182230">"Странице"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Све странице (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml index 09ce6ee6382e..c46d4dffc312 100644 --- a/packages/PrintSpooler/res/values-sv/strings.xml +++ b/packages/PrintSpooler/res/values-sv/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Pappersstorlek"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Pappersstorlek:"</string>      <string name="label_color" msgid="1108690305218188969">"Färg"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dubbelsidigt"</string>      <string name="label_orientation" msgid="2853142581990496477">"Orientering"</string>      <string name="label_pages" msgid="7768589729282182230">"Sidor"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Alla <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index a0497e64519f..9c808be69491 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Ukubwa wa karatasi"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Ukubwa wa karatasi:"</string>      <string name="label_color" msgid="1108690305218188969">"Rangi"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Maradufu"</string>      <string name="label_orientation" msgid="2853142581990496477">"Mkao"</string>      <string name="label_pages" msgid="7768589729282182230">"Kurasa"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Kurasa zote <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ta-rIN/strings.xml b/packages/PrintSpooler/res/values-ta-rIN/strings.xml index a50470a32c5b..1395d29da9a8 100644 --- a/packages/PrintSpooler/res/values-ta-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ta-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"காகித அளவு"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"காகித அளவு:"</string>      <string name="label_color" msgid="1108690305218188969">"வண்ணம்"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"டியூப்ளெக்ஸ்"</string>      <string name="label_orientation" msgid="2853142581990496477">"திசையமைப்பு"</string>      <string name="label_pages" msgid="7768589729282182230">"பக்கங்கள்"</string>      <string name="template_all_pages" msgid="3322235982020148762">"எல்லாம்: <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"கருப்பு & வெள்ளை"</item>      <item msgid="2762241247228983754">"வண்ணம்"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"ஏதுமில்லை"</item> +    <item msgid="7296563835355641719">"லாங் எட்ஜ்"</item> +    <item msgid="79513688117503758">"ஷார்ட் எட்ஜ்"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"உறுவப்படம்"</item>      <item msgid="3199660090246166812">"நிலத்தோற்றம்"</item> diff --git a/packages/PrintSpooler/res/values-te-rIN/strings.xml b/packages/PrintSpooler/res/values-te-rIN/strings.xml index b35520d69468..9958f05d4189 100644 --- a/packages/PrintSpooler/res/values-te-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-te-rIN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"కాగితపు పరిమాణం"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"కాగితపు పరిమాణం:"</string>      <string name="label_color" msgid="1108690305218188969">"రంగు"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"డూప్లెక్స్"</string>      <string name="label_orientation" msgid="2853142581990496477">"దృగ్విన్యాసం"</string>      <string name="label_pages" msgid="7768589729282182230">"పేజీలు"</string>      <string name="template_all_pages" msgid="3322235982020148762">"మొత్తం <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"నలుపు & తెలుపు"</item>      <item msgid="2762241247228983754">"రంగు"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"ఏదీ వద్దు"</item> +    <item msgid="7296563835355641719">"పొడవైన అంచు"</item> +    <item msgid="79513688117503758">"చిన్న అంచు"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"పోర్ట్రెయిట్"</item>      <item msgid="3199660090246166812">"ల్యాండ్స్కేప్"</item> diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml index 9c8d55c1ff1d..cef716a276ea 100644 --- a/packages/PrintSpooler/res/values-th/strings.xml +++ b/packages/PrintSpooler/res/values-th/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"ขนาดของกระดาษ"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"ขนาดของกระดาษ:"</string>      <string name="label_color" msgid="1108690305218188969">"สี"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ดูเพล็กซ์"</string>      <string name="label_orientation" msgid="2853142581990496477">"การวางแนว"</string>      <string name="label_pages" msgid="7768589729282182230">"หน้า"</string>      <string name="template_all_pages" msgid="3322235982020148762">"ทั้ง <xliff:g id="PAGE_COUNT">%1$s</xliff:g> หน้า"</string> diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml index 9e4c7bed7a8c..58e1930a589d 100644 --- a/packages/PrintSpooler/res/values-tl/strings.xml +++ b/packages/PrintSpooler/res/values-tl/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Laki ng papel"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Laki ng papel:"</string>      <string name="label_color" msgid="1108690305218188969">"Kulay"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Oryentasyon"</string>      <string name="label_pages" msgid="7768589729282182230">"Mga Page"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Lahat ng <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml index 902f4ce34bf5..39b5c9a3559d 100644 --- a/packages/PrintSpooler/res/values-tr/strings.xml +++ b/packages/PrintSpooler/res/values-tr/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Kağıt boyutu"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Kağıt boyutu:"</string>      <string name="label_color" msgid="1108690305218188969">"Renkli"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Dubleks"</string>      <string name="label_orientation" msgid="2853142581990496477">"Sayfa yönü"</string>      <string name="label_pages" msgid="7768589729282182230">"Sayfa"</string>      <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> sayfanın tamamı"</string> diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index 71f9d61b0b29..73030e4d6d1c 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Розмір паперу"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Розмір паперу:"</string>      <string name="label_color" msgid="1108690305218188969">"Колір"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Двосторонній друк"</string>      <string name="label_orientation" msgid="2853142581990496477">"Орієнтація"</string>      <string name="label_pages" msgid="7768589729282182230">"Сторінки"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Усі <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ur-rPK/strings.xml b/packages/PrintSpooler/res/values-ur-rPK/strings.xml index 2b32c30d7e6e..5c9f471cc7b0 100644 --- a/packages/PrintSpooler/res/values-ur-rPK/strings.xml +++ b/packages/PrintSpooler/res/values-ur-rPK/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"کاغذ کا سائز"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"کاغذ کا سائز:"</string>      <string name="label_color" msgid="1108690305218188969">"رنگ"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"ڈوپلیکس"</string>      <string name="label_orientation" msgid="2853142581990496477">"سمت بندی"</string>      <string name="label_pages" msgid="7768589729282182230">"صفحات"</string>      <string name="template_all_pages" msgid="3322235982020148762">"سبھی <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"سیاہ و سفید"</item>      <item msgid="2762241247228983754">"رنگ"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"کوئی نہیں"</item> +    <item msgid="7296563835355641719">"طویل کنارہ"</item> +    <item msgid="79513688117503758">"مختصر کنارہ"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"پورٹریٹ"</item>      <item msgid="3199660090246166812">"لینڈ اسکیپ"</item> diff --git a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml index 57103d40229c..40b7109232a0 100644 --- a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml +++ b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Qog‘oz o‘lchami"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Qog‘oz o‘lchami:"</string>      <string name="label_color" msgid="1108690305218188969">"Rang"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Ikki tomonlama"</string>      <string name="label_orientation" msgid="2853142581990496477">"Joylashuv"</string>      <string name="label_pages" msgid="7768589729282182230">"Sahifalar"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Barchasi (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> @@ -79,9 +78,11 @@      <item msgid="7602948745415174937">"Oq & qora"</item>      <item msgid="2762241247228983754">"Rang"</item>    </string-array> -    <!-- no translation found for duplex_mode_labels:0 (3882302912790928315) --> -    <!-- no translation found for duplex_mode_labels:1 (7296563835355641719) --> -    <!-- no translation found for duplex_mode_labels:2 (79513688117503758) --> +  <string-array name="duplex_mode_labels"> +    <item msgid="3882302912790928315">"Hech biri"</item> +    <item msgid="7296563835355641719">"Uzun tomoni"</item> +    <item msgid="79513688117503758">"Qisqa tomoni"</item> +  </string-array>    <string-array name="orientation_labels">      <item msgid="4061931020926489228">"Bo‘yiga"</item>      <item msgid="3199660090246166812">"Eniga"</item> diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml index 3a9f8d4cc124..c61c1fa14115 100644 --- a/packages/PrintSpooler/res/values-vi/strings.xml +++ b/packages/PrintSpooler/res/values-vi/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Khổ giấy"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Khổ giấy:"</string>      <string name="label_color" msgid="1108690305218188969">"Màu"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Hai mặt"</string>      <string name="label_orientation" msgid="2853142581990496477">"Hướng"</string>      <string name="label_pages" msgid="7768589729282182230">"Trang"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Tất cả <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 80bab12c6684..3eb1b63962f7 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"纸张尺寸"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"纸张尺寸:"</string>      <string name="label_color" msgid="1108690305218188969">"颜色"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"双面模式"</string>      <string name="label_orientation" msgid="2853142581990496477">"方向"</string>      <string name="label_pages" msgid="7768589729282182230">"页数"</string>      <string name="template_all_pages" msgid="3322235982020148762">"全部<xliff:g id="PAGE_COUNT">%1$s</xliff:g>页"</string> diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml index bf6262c17a2a..88c6961e8d2f 100644 --- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"紙張大小"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"紙張大小:"</string>      <string name="label_color" msgid="1108690305218188969">"顏色"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"雙面列印"</string>      <string name="label_orientation" msgid="2853142581990496477">"方向"</string>      <string name="label_pages" msgid="7768589729282182230">"頁數"</string>      <string name="template_all_pages" msgid="3322235982020148762">"全部 <xliff:g id="PAGE_COUNT">%1$s</xliff:g> 頁"</string> diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml index d822b4121760..2d8631c1b773 100644 --- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"紙張大小"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"紙張大小:"</string>      <string name="label_color" msgid="1108690305218188969">"色彩"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"雙面"</string>      <string name="label_orientation" msgid="2853142581990496477">"方向"</string>      <string name="label_pages" msgid="7768589729282182230">"頁面"</string>      <string name="template_all_pages" msgid="3322235982020148762">"全部 <xliff:g id="PAGE_COUNT">%1$s</xliff:g> 頁"</string> diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml index 2b05cb0e6d9b..d3ee17c49b36 100644 --- a/packages/PrintSpooler/res/values-zu/strings.xml +++ b/packages/PrintSpooler/res/values-zu/strings.xml @@ -24,8 +24,7 @@      <string name="label_paper_size" msgid="908654383827777759">"Usayizi wekhasi"</string>      <string name="label_paper_size_summary" msgid="5668204981332138168">"Usayizi wekhasi"</string>      <string name="label_color" msgid="1108690305218188969">"Umbala"</string> -    <!-- no translation found for label_duplex (1263181386446435253) --> -    <skip /> +    <string name="label_duplex" msgid="1263181386446435253">"Duplex"</string>      <string name="label_orientation" msgid="2853142581990496477">"Umumo"</string>      <string name="label_pages" msgid="7768589729282182230">"Amakhasi"</string>      <string name="template_all_pages" msgid="3322235982020148762">"Konke <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index c3e23d245de4..2eb7abff6587 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -127,6 +127,7 @@ public class WifiTracker {      public void pauseScanning() {          if (mScanner != null) {              mScanner.pause(); +            mScanner = null;          }      } @@ -134,10 +135,10 @@ public class WifiTracker {       * Resume scanning for wifi networks after it has been paused.       */      public void resumeScanning() { +        if (mScanner == null) { +            mScanner = new Scanner(); +        }          if (mWifiManager.isWifiEnabled()) { -            if (mScanner == null) { -                mScanner = new Scanner(); -            }              mScanner.resume();          }          updateAccessPoints(); @@ -335,11 +336,17 @@ public class WifiTracker {      private void updateWifiState(int state) {          if (state == WifiManager.WIFI_STATE_ENABLED) { -            mScanner.resume(); +            if (mScanner != null) { +                // We only need to resume if mScanner isn't null because +                // that means we want to be scanning. +                mScanner.resume(); +            }          } else {              mLastInfo = null;              mLastNetworkInfo = null; -            mScanner.pause(); +            if (mScanner != null) { +                mScanner.pause(); +            }          }          if (mListener != null) {              mListener.onWifiStateChanged(state); @@ -382,26 +389,34 @@ public class WifiTracker {      @VisibleForTesting      class Scanner extends Handler { +        private static final int MSG_SCAN = 0; +          private int mRetry = 0;          void resume() { -            if (!hasMessages(0)) { -                sendEmptyMessage(0); +            if (!hasMessages(MSG_SCAN)) { +                sendEmptyMessage(MSG_SCAN);              }          }          void forceScan() { -            removeMessages(0); -            sendEmptyMessage(0); +            removeMessages(MSG_SCAN); +            sendEmptyMessage(MSG_SCAN);          }          void pause() {              mRetry = 0; -            removeMessages(0); +            removeMessages(MSG_SCAN); +        } + +        @VisibleForTesting +        boolean isScanning() { +            return hasMessages(MSG_SCAN);          }          @Override          public void handleMessage(Message message) { +            if (message.what != MSG_SCAN) return;              if (mWifiManager.startScan()) {                  mRetry = 0;              } else if (++mRetry >= 3) { diff --git a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java index 73d49380b524..8eb1ca485881 100644 --- a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java +++ b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java @@ -201,6 +201,29 @@ public class WifiTrackerTest extends BaseTest {          assertTrue("Connected to wifi", accessPoints.get(0).isActive());      } +    public void testEnableResumeScanning() { +        mWifiTracker.mScanner = null; + +        Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION); +        // Make sure disable/enable cycle works with no scanner (no crashing). +        i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); +        mWifiTracker.mReceiver.onReceive(mContext, i); +        i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED); +        mWifiTracker.mReceiver.onReceive(mContext, i); + +        Mockito.when(mWifiManager.isWifiEnabled()).thenReturn(false); +        i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); +        mWifiTracker.mReceiver.onReceive(mContext, i); +        // Now enable scanning while wifi is off, it shouldn't start. +        mWifiTracker.resumeScanning(); +        assertFalse(mWifiTracker.mScanner.isScanning()); + +        // Turn on wifi and make sure scanning starts. +        i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED); +        mWifiTracker.mReceiver.onReceive(mContext, i); +        assertTrue(mWifiTracker.mScanner.isScanning()); +    } +      private String[] generateTestNetworks(List<WifiConfiguration> wifiConfigs,              List<ScanResult> scanResults, boolean connectedIsEphemeral) {          String[] expectedSsids = new String[NUM_NETWORKS]; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 6a05af11757b..06e26bd651e1 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -28,8 +28,8 @@ import android.database.Cursor;  import android.database.sqlite.SQLiteDatabase;  import android.database.sqlite.SQLiteOpenHelper;  import android.database.sqlite.SQLiteStatement; +import android.media.AudioSystem;  import android.media.AudioManager; -import android.media.AudioService;  import android.net.ConnectivityManager;  import android.os.Build;  import android.os.Environment; @@ -568,7 +568,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {                  stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"                          + " VALUES(?,?);");                  loadSetting(stmt, Settings.System.VOLUME_BLUETOOTH_SCO, -                        AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO)); +                        AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));                  db.setTransactionSuccessful();              } finally {                  db.endTransaction(); @@ -2051,11 +2051,11 @@ public class DatabaseHelper extends SQLiteOpenHelper {          int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0);          // If the ringer vibrate value is invalid, set it to the default          if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) { -            vibrateSetting = AudioService.getValueForVibrateSetting(0, +            vibrateSetting = AudioSystem.getValueForVibrateSetting(0,                      AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);          }          // Apply the same setting to the notification vibrate value -        vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting, +        vibrateSetting = AudioSystem.getValueForVibrateSetting(vibrateSetting,                  AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting);          SQLiteStatement stmt = null; @@ -2199,25 +2199,25 @@ public class DatabaseHelper extends SQLiteOpenHelper {                      + " VALUES(?,?);");              loadSetting(stmt, Settings.System.VOLUME_MUSIC, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_MUSIC)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_MUSIC));              loadSetting(stmt, Settings.System.VOLUME_RING, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_RING)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_RING));              loadSetting(stmt, Settings.System.VOLUME_SYSTEM, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM));              loadSetting(                      stmt,                      Settings.System.VOLUME_VOICE, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL));              loadSetting(stmt, Settings.System.VOLUME_ALARM, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_ALARM)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_ALARM));              loadSetting(                      stmt,                      Settings.System.VOLUME_NOTIFICATION, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION));              loadSetting(                      stmt,                      Settings.System.VOLUME_BLUETOOTH_SCO, -                    AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO)); +                    AudioSystem.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));              // By default:              // - ringtones, notification, system and music streams are affected by ringer mode @@ -2236,7 +2236,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {                      ringerModeAffectedStreams);              loadSetting(stmt, Settings.System.MUTE_STREAMS_AFFECTED, -                    AudioService.DEFAULT_MUTE_STREAMS_AFFECTED); +                    AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED);          } finally {              if (stmt != null) stmt.close();          } @@ -2256,10 +2256,10 @@ public class DatabaseHelper extends SQLiteOpenHelper {              // Vibrate on by default for ringer, on for notification              int vibrate = 0; -            vibrate = AudioService.getValueForVibrateSetting(vibrate, +            vibrate = AudioSystem.getValueForVibrateSetting(vibrate,                      AudioManager.VIBRATE_TYPE_NOTIFICATION,                      AudioManager.VIBRATE_SETTING_ONLY_SILENT); -            vibrate |= AudioService.getValueForVibrateSetting(vibrate, +            vibrate |= AudioSystem.getValueForVibrateSetting(vibrate,                      AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT);              loadSetting(stmt, Settings.System.VIBRATE_ON, vibrate);          } finally { diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index ba2c8eb7fa42..79c37e8485c2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Meer instellings"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Klaar"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Gekoppel"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Gekoppel via Wi-Fi-assistent"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Gestoor"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Koppel tans …"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"USB-verbinding"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Warmkol"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"soek"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Kon nie <xliff:g id="APP">%s</xliff:g> begin nie."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Maak alle programme toe"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Verdeel horisontaal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verdeel vertikaal"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Verdeel gepasmaak"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Gelaai"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Laai tans"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot vol"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index f4ba6f670d43..6db37cc93005 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"ተጨማሪ ቅንብሮች"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"ተከናውኗል"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"ተገናኝቷል"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"በWi‑Fi ረዳት አማካኝነት ተገናኝቷል"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"ተቀምጧል"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"በማገናኘት ላይ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"በማገናኘት ላይ"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"መገናኛ ነጥብ"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ፈልግ"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ን መጀመር አልተቻለም።"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"ሁሉንም ማመልከቻዎች አሰናብት"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"አግድም ክፈል"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ቁልቁል ክፈል"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"በብጁ ክፈል"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ባትሪ ሞልቷል"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ኃይል በመሙላት ላይ"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> እስኪሞላ ድረስ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 67e151ec3af6..c3cb56b3f450 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"المزيد من الإعدادات"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"تم"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"متصل"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"تم التوصيل عبر مساعد Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"تم الحفظ"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"جارٍ الاتصال..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"النطاق"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطة اتصال"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"بحث"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"تعذر بدء <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"تجاهل كل التطبيقات"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسيم أفقي"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسيم رأسي"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"تقسيم مخصص"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"تم الشحن"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"جارٍ الشحن"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> حتى الاكتمال"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 4d37f4abd164..40946d31ba93 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Още настройки"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Установена е връзка"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Установена е връзка чрез помощника за Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Запазено"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Установява се връзка..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетъринг"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка за достъп"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"търсене"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не можа да стартира."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Отхвърляне на всички приложения"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хоризонтално разделяне"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Вертикално разделяне"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Персонализирано разделяне"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заредена"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарежда се"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до пълно зареждане"</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 71c78b24fdfe..f02a27862153 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"আরো সেটিংস"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন হয়েছে"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"সংযুক্ত হয়েছে"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi সহায়ক-এর মাধ্যমে সংযুক্ত হয়েছে"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"সংরক্ষিত হয়েছে"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"সংযুক্ত হচ্ছে..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেদারিং"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"অনুসন্ধান"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> শুরু করা যায়নি৷"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"সমস্ত অ্যাপ্লিকেশন খারিজ করুন"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"অনুভূমিক স্প্লিট"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উল্লম্ব স্প্লিট"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"কাস্টম স্প্লিট করুন"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"চার্জ হয়েছে"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"চার্জ হচ্ছে"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"পূর্ণ হতে <xliff:g id="CHARGING_TIME">%s</xliff:g> সময় লাগবে"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 16d5d109513d..c9d7f3ea8910 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Més opcions"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Fet"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connectat"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connectat mitjançant l\'assistent de Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"S\'ha desat"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"S\'està connectant..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoratge a xarxa"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"No s\'ha pogut iniciar <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Descarta totes les aplicacions"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisió horitzontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisió vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisió personalitzada"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"S\'està carregant"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> per completar la càrrega"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index c9491641fa6a..5f48a85d9dda 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Další nastavení"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Připojeno"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Připojeno pomocí asistenta připojení Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Uloženo"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Připojování..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Sdílení datového připojení"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"vyhledat"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikaci <xliff:g id="APP">%s</xliff:g> nelze spustit."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Odstranit všechny aplikace"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vodorovné rozdělení"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikální rozdělení"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Vlastní rozdělení"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabito"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíjení"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do plného nabití"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 733f0c99d2d2..0beb8fb2802a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Flere indstillinger"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Udført"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Tilsluttet"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Forbindelse via Wi-Fi-assistent"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Gemt"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Opretter forbindelse…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Netdeling"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"søg"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> kunne ikke startes."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Luk alle applikationer"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Opdel vandret"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Opdel lodret"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Opdel brugerdefineret"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opladet"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Oplader"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> indtil fuld opladet"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 9d0b9072e5a6..b4089373801c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Weitere Einstellungen"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Fertig"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Verbunden"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Über WLAN-Assistenten verbunden"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Gespeichert"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"Suche"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> konnte nicht gestartet werden."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Alle Apps entfernen"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Geteilte Schaltfläche – horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Geteilte Schaltfläche – vertikal"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Geteilte Schaltfläche – benutzerdefiniert"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Aufgeladen"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Wird aufgeladen"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Voll in <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 5e672b3c9196..97a175ac24b4 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Περισσότερες ρυθμίσεις"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Τέλος"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Συνδέθηκε"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Σύνδεση μέσω βοηθού Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Αποθηκεύτηκε"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"αναζήτηση"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Δεν ήταν δυνατή η εκκίνηση της εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Παράβλεψη όλων των εφαρμογών"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Οριζόντιος διαχωρισμός"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Κάθετος διαχωρισμός"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Προσαρμοσμένος διαχωρισμός"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Φορτίστηκε"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Φόρτιση"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> για πλήρη φόρτιση"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 0d627cfaf2c7..62b93b657326 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"More settings"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Done"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connected"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connected via Wi‑Fi assistant"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Saved"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Dismiss all applications"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> until full"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 0d627cfaf2c7..62b93b657326 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"More settings"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Done"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connected"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connected via Wi‑Fi assistant"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Saved"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Dismiss all applications"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> until full"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index a70ef9a36377..f79c5ede6eec 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Más configuraciones"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Listo"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conexión por asistente de Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado/a"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"No se pudo iniciar <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Descartar todas las aplicaciones"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completarse"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 54926cebd18e..6bd03c900f96 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Más opciones"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Listo"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado a través de asistente Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"No se ha podido iniciar <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Ignorar todas las aplicaciones"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completarse"</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index cb2dd7b59636..b17eb05291df 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Rohkem seadeid"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Valmis"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Ühendatud"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ühendatud WiFi-abi kaudu"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Salvestatud"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Ühenduse loomine ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jagamine"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Leviala"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"otsing"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Rakendust <xliff:g id="APP">%s</xliff:g> ei saanud käivitada."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Loobu kõikidest rakendustest"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horisontaalne poolitamine"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikaalne poolitamine"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Kohandatud poolitamine"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laetud"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Laadimine"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Täislaadimiseks kulub <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index ae02787f2197..be21e9d0755f 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Ezarpen gehiago"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Eginda"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Konektatuta"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi laguntzailearen bidez konektatuta"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Gordeta"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Konektatzen…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Konexioa partekatzea"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Sare publikoa"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"bilatu"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Ezin izan da hasi <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Baztertu aplikazio guztiak"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Banaketa horizontala"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Banaketa bertikala"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Banaketa pertsonalizatua"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatzeko"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index becc46451e36..11021b15ae1e 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"تنظیمات بیشتر"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"انجام شد"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"متصل"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"متصل شده از طریق دستیار Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"ذخیره شده"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"در حال اتصال..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"اتصال به اینترنت با تلفن همراه"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"جستجو"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> شروع نشد."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"رد کردن همه برنامهها"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسیم افقی"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسیم عمودی"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"سفارشی کردن تقسیم"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"شارژ کامل شد"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"در حال شارژ شدن"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> مانده تا شارژ کامل شود"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 5fbe650ab812..eac124edb5b3 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Lisäasetukset"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Valmis"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Yhdistetty"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Yhteys muodostettu Wi‑Fi-apurin kautta"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Tallennetut"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Yhdistetään…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jaettu yhteys"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"haku"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Sovelluksen <xliff:g id="APP">%s</xliff:g> käynnistäminen epäonnistui."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Hylkää kaikki sovellukset"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vaakasuuntainen jako"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pystysuuntainen jako"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Muokattu jako"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Ladattu"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Ladataan"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> kunnes täynnä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index daf87ef894f4..387b62192fc2 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Plus de paramètres"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Terminé"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connecté"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connecté à l\'aide de l\'assistant Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Enregistré"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès sans fil"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Supprimer toutes les applications"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Séparation horizontale"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Séparation verticale"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Séparation personnalisée"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargée"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Charge en cours..."</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargée dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 32dac570c601..eda4afb4bee8 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Plus de paramètres"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"OK"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connecté"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connecté via l\'assistant Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Enregistré"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Supprimer toutes les applications"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"–"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Séparation horizontale"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Séparation verticale"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Séparation personnalisée"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargé"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"En charge"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargé dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 8b1a3da2377b..9ae9493a130b 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Máis opcións"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Feito"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado ao asistente de wifi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Gardado"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoraxe á rede"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona wifi"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Non foi posible iniciar <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Rexeitar todas as aplicacións"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dividir en horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dividir en vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dividir de xeito personalizado"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completar a carga"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 34040d14b0d8..82f9ddda5326 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"और सेटिंग"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"पूर्ण"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"कनेक्ट है"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"वाई-फ़ाई सहायक के द्वारा कनेक्ट है"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"सहेजा गया"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट हो रहा है..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"खोज"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ नहीं किया जा सका."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"सभी ऐप्लिकेशन ख़ारिज करें"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"कस्टम रूप से विभाजित करें"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज हो गई है"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हो रही है"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"पूर्ण होने में <xliff:g id="CHARGING_TIME">%s</xliff:g> शेष"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 5fc2f8830c3f..1a062612edcd 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Više  postavki"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Gotovo"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Povezano"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Povezani putem pomoćnika za Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Spremljeno"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Povezivanje..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Dijeljenje veze"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Žarišna točka"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"pretraži"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Odbaci sve aplikacije"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podijeli vodoravno"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podijeli okomito"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podijeli prilagođeno"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjeno"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do napunjenosti"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 8b0edbcf8ff2..bc08adcb893b 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"További beállítások"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Kész"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Csatlakoztatva"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Csatlakozva Wi‑Fi-segéddel"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Mentett"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Csatlakozás…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Megosztás"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"keresés"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Nem lehet elindítani a következőt: <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Összes alkalmazás elvetése"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"–"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Osztott vízszintes"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Osztott függőleges"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Osztott egyéni"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Feltöltve"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Töltés"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> a teljes töltöttségig"</string> @@ -338,7 +330,7 @@      <string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string>      <string name="battery_saver_notification_text" msgid="820318788126672692">"Csökkenti a teljesítményt és a háttéradatok használatát"</string>      <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Akkumulátorkímélő mód kikapcsolása"</string> -    <string name="notification_hidden_text" msgid="1135169301897151909">"Tartalomjegyzék elrejtve"</string> +    <string name="notification_hidden_text" msgid="1135169301897151909">"Tartalom elrejtve"</string>      <string name="media_projection_dialog_text" msgid="3071431025448218928">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkalmazás rögzíteni fog mindent, ami megjelenik a képernyőn."</string>      <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne jelenjen meg többé"</string>      <string name="clear_all_notifications_text" msgid="814192889771462828">"Az összes törlése"</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 2fa89c8df491..9b673bc653ca 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Հավելյալ կարգավորումներ"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Կապակցված է Wi‑Fi Օգնականի միջոցով"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Պահված է"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Միանում է..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Միացում"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Թեժ կետ"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"որոնել"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Հնարավոր չէ գործարկել <xliff:g id="APP">%s</xliff:g>-ը:"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Հեռացնել բոլոր հավելվածները"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Հորիզոնական տրոհում"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Ուղղահայաց տրոհում"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Հատուկ տրոհում"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Լիցքավորված է"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Լիցքավորվում է"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Լրիվ լիցքավորմանը մնաց <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 501b99e1be92..54f7f4625945 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Setelan lainnya"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Tersambung"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Terhubung melalui Asisten Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Disimpan"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"telusuri"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Tidak dapat memulai <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Tutup semua aplikasi"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Pisahkan Horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pisahkan Vertikal"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pisahkan Khusus"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Terisi"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengisi daya"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> sampai penuh"</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index a408204333d4..8fcf8b15a66a 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Fleiri stillingar"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Lokið"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Tengt"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Tengt í gegnum Wi-Fi aðstoð"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Vistað"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Tengist..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tjóðrun"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Heitur reitur"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"leita"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Ekki var hægt að ræsa <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Fjarlægja öll forrit"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Lárétt skipting"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Lóðrétt skipting"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Sérsniðin skipting"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Fullhlaðin"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Í hleðslu"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> þar til fullri hleðslu er náð"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 369e51a4dbb5..06680386ad62 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Altre impostazioni"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Fine"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Connesso"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connesso tramite assistente Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Salvata"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Connessione..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossibile avviare <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Rimuovi tutte le applicazioni"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisione in orizzontale"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisione in verticale"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisione personalizzata"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carica"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"In carica"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> al termine della carica"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index bdfdcc35c9a6..ac7fd18e7aea 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"הגדרות נוספות"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"בוצע"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"מחובר"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"מחובר באמצעות אסיסטנט ה-Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"נשמר"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"מתחבר..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"שיתוף אינטרנט בין ניידים"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"נקודה לשיתוף אינטרנט"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"חפש"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"לא ניתן היה להפעיל את <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"סגור את כל האפליקציות"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"פיצול אופקי"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"פיצול אנכי"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"פיצול מותאם אישית"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"טעון"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"טוען"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> עד למילוי"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 330e55a363d2..8c30d5892479 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"詳細設定"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"完了"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"接続済み"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fiアシスタント経由で接続"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"保存済み"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"接続しています..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"テザリング"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"アクセスポイント"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"検索"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>を開始できません。"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"すべてのアプリケーションを消去"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"横に分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"縦に分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"分割(カスタム)"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"充電が完了しました"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"充電しています"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"充電完了まで<xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 26b4025c512d..7262638c8dc8 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"დამატებითი პარამეტრები"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"დასრულდა"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"დაკავშირებულია"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"დაკავშირებული Wi-Fi თანაშემწით"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"დამახსოვრებულია"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"დაკავშირება..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"მოდემის რეჟიმი"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ძიება"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>-ის გამოძახება ვერ მოხერხდა."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"ყველა აპლიკაციის გაუქმება"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ჰორიზონტალური გაყოფა"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ვერტიკალური გაყოფა"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ინდივიდუალური გაყობა"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"დატენილია"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"მიმდინარეობს დატენვა"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> სრულად დატენვამდე"</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 6258a8cab945..a57f71ef15b0 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Қосымша параметрлер"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Дайын"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Қосылды"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi көмекшісі арқылы қосылу орындалды"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Сақталды"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Қосылуда…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хот-спот"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"іздеу"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> іске қосу мүмкін болмады."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Барлық қолданбаларды қабылдамау"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Бөлінген көлденең"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Бөлінген тік"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Бөлінген теңшелетін"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Зарядталды"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядталуда"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Толғанға дейін <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 71d616fb2b43..9741b36345bd 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"ការកំណត់ច្រើនទៀត"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"រួចរាល់"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"បានភ្ជាប់"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"បានភ្ជាប់តាមរយៈជំនួយការ Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"បានរក្សាទុក"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"កំពុងតភ្ជាប់..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ការភ្ជាប់"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ហតស្ប៉ត"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"មិនអាចចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ទេ។"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"បោះបង់កម្មវិធីទាំងអស់"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"បំបែកផ្តេក"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"បំបែកបញ្ឈរ"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"បំបែកផ្ទាល់ខ្លួន"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងបញ្ចូលថ្ម"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូតដល់ពេញ"</string> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index b2e2a1aac56b..5bfa66f159ad 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"ಮುಗಿದಿದೆ"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi ಸಹಾಯಕದ ಮೂಲಕ ಸಂಪರ್ಕಿತಗೊಳಿಸಲಾಗಿದೆ"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"ಉಳಿಸಲಾಗಿದೆ"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ಟೆಥರಿಂಗ್"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ಹಾಟ್ಸ್ಪಾಟ್"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ಹುಡುಕಾಟ"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲು ಸಾದ್ಯವಿಲ್ಲ."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸಿ"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index a0d614ab8456..922e4c1fb6f0 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"설정 더보기"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"완료"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"연결됨"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi 도우미를 통해 연결됨"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"저장됨"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"연결 중..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"테더링"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"핫스팟"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"검색"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>을(를) 시작할 수 없습니다."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"모든 애플리케이션 닫기"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"수평 분할"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"수직 분할"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"맞춤 분할"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"충전됨"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"충전 중"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"완충까지 <xliff:g id="CHARGING_TIME">%s</xliff:g> 남음"</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index f51814f62e4b..6c54cb6864b7 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -287,8 +287,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Дагы жөндөөлөр"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Аткарылды"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Туташкан"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi жардамчысы аркылуу туташып турат"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Сакталды"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Туташууда…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Туташуу чекити"</string> @@ -307,18 +305,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"издөө"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> баштай алган жок."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Бардык колдонмолорду көз жаздымда калтыруу"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Туурасынан бөлүү"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Тигинен бөлүү"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ыңгайлаштырылган бөлүү"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Кубатталды"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Кубатталууда"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> толгонго чейин"</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 01ef31a5dff3..f205d0f8d8ed 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"ແລ້ວໆ"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"ເຊື່ອມຕໍ່ແລ້ວ"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"ເຊື່ອມຕໍ່ຜ່ານ Wi‑Fi ຕົວຊ່ວຍແລ້ວ"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"ບັນທຶກແລ້ວ"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"ກຳລັງເຊື່ອມຕໍ່..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ການປ່ອນສັນຍານ"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ຮັອດສະປອດ"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ຊອກຫາ"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"ບໍ່ສາມາດເລີ່ມ <xliff:g id="APP">%s</xliff:g> ໄດ້."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"ປ່ອຍທຸກແອັບພລິເຄ"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ການແຍກລວງຂວາງ"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ການແຍກລວງຕັ້ງ"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ການແຍກກຳນົດເອງ"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ສາກເຕັມແລ້ວ."</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ກຳລັງສາກໄຟ"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ຈຶ່ງຈະເຕັມ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 50fdafff518c..531884442194 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Daugiau nustatymų"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Atlikta"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Prijungtas"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Prisijungta naudojant „Wi‑Fi“ pagelbiklį"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Išsaugota"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Prisijungiama..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Susiejimas"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Viešosios interneto prieigos taškas"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"paieška"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Nepavyko paleisti <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Atsisakyti visų programų"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"–"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontalus skaidymas"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikalus skaidymas"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tinkintas skaidymas"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Įkrautas"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Kraunamas"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> iki visiško įkrovimo"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 4d36ab512f84..d94c122c5ce1 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Vairāk iestatījumu"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Gatavs"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Pievienota"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Izveidots savienojums ar Wi‑Fi palīgu"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Saglabāts"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Notiek savienojuma izveide…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Piesaiste"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tīklājs"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"Meklēt"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Nevarēja palaist lietotni <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Noņemt visas lietojumprogrammas"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontāls dalījums"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikāls dalījums"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pielāgots dalījums"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulators uzlādēts"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Notiek uzlāde"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> līdz pilnam akumulatoram"</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index a026e6fa57da..b606e33811df 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Повеќе поставки"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Поврзано"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Поврзано преку помошник за Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Зачувано"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Се поврзува..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Поврзување"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка на пристап"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"пребарај"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не може да се вклучи."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Отфрли ги сите апликации"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"22°"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"22°"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"22°"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Раздели хоризонтално"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Раздели вертикално"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Раздели прилагодено"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Наполнета"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Се полни"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> додека не се наполни"</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index d2b224757583..6a65e6d10c6e 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"പൂർത്തിയാക്കി"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"കണക്റ്റുചെയ്തു"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi അസിസ്റ്റന്റ് മുഖേന കണക്റ്റുചെയ്തു"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"സംരക്ഷിച്ചു"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"കണക്റ്റുചെയ്യുന്നു..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ടെതറിംഗ്"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ഹോട്ട്സ്പോട്ട്"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"തിരയുക"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ആരംഭിക്കാനായില്ല."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"എല്ലാ അപ്ലിക്കേഷനുകളും നിരസിക്കുക"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"തിരശ്ചീനമായി വേർതിരിക്കുക"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ലംബമായി വേർതിരിക്കുക"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ഇഷ്ടാനുസൃതമായി വേർതിരിക്കുക"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ചാർജ്ജുചെയ്തു"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ചാർജ്ജുചെയ്യുന്നു"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"പൂർണ്ണമായും ചാർജ്ജാകുന്നതിന്, <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 4982f1086130..1d53b17f2fd9 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Өөр тохиргоо"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Дууссан"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Холбогдсон"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi-Fi туслагчаар дамжуулан холбогдлоо"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Хадгалагдсан"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Холбогдож байна..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Модем болгох"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Сүлжээний цэг"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"хайх"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж чадсангүй."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Бүх програмыг арилгах"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хэвтээ чиглэлд хуваах"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Босоо чиглэлд хуваах"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Хүссэн хэлбэрээр хуваах"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Цэнэглэгдсэн"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Цэнэглэж байна"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"дүүргэхэд <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 900890c54a91..dc5f64960795 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"अधिक सेटिंग्ज"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"पूर्ण झाले"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"कनेक्ट केलेले"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi सहाय्यक द्वारे कनेक्ट केले"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"जतन केलेले"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट करीत आहे..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"शोधा"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ करणे शक्य झाले नाही."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"सर्व अनुप्रयोग डिसमिस करा"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज विभाजित करा"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"अनुलंब विभाजित करा"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"सानुकूल विभाजित करा"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज झाली"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज होत आहे"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण होईपर्यंत"</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index f3c6e32b030e..4188bd593c14 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Lagi tetapan"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Disambungkan"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Disambungkan melalui Pembantu Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Disimpan"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Penambatan"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tempat liputan"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"cari"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Tidak dapat memulakan <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Ketepikan semua aplikasi"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Mendatar Terpisah"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Menegak Terpisah"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tersuai Terpisah"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Sudah dicas"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengecas"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Lagi <xliff:g id="CHARGING_TIME">%s</xliff:g> untuk penuh"</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index c9db1b13b4d7..46ba92c5fa6f 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"နောက်ထပ် ဆက်တင်များ"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"လုပ်ပြီး"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"ချိတ်ဆက်ထား"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"ကြိုးမဲ့ကူညီသူမှတဆင့် ချိတ်ဆက်ပြီး၏"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"သိမ်းဆည်းပြီး"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"ဆက်သွယ်နေ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"တွဲချီပေးခြင်း"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ဟော့စပေါ့"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ရှာဖွေရန်"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ကို မစနိုင်ပါ။"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"အပလီကေးရှင်းများအားလုံး ဖယ်ထုတ်မည်"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"−"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"..."</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ရေပြင်ညီ ပိုင်းမည်"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ဒေါင်လိုက်ပိုင်းမည်"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"စိတ်ကြိုက် ပိုင်းမည်"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index b2fbd78c0887..9e873070a0a6 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Flere innstillinger"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Ferdig"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Tilkoblet"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Koblet til via en Wi-Fi-assistent"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Lagret"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Kobler til …"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tilknytning"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Wi-Fi-sone"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"Søk"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Kunne ikke starte <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Avvis alle apper"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Del horisontalt"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Del vertikalt"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Del tilpasset"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Oppladet"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Lader"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Fulladet om <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 67a1c3043df6..7ccab6bdb580 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"थप सेटिङहरू"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"भयो"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"जोडिएको"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi-Fi सहायक द्वारा जोडिएको"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"सुरक्षित गरियो"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"जडान हुँदै..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदर गर्दै"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हटस्पट"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"खोजी गर्नुहोस्"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"सुरु गर्न सकिएन <xliff:g id="APP">%s</xliff:g>।"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"सबै अनुप्रयोगहरू खारेज गर्नुहोस्"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"तेर्सो रूपमा विभाजन गर्नुहोस्"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ठाडो रूपमा विभाजन गर्नुहोस्"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अनुकूलन विभाजन गर्नुहोस्"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज भयो"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हुँदै"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण नभएसम्म"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 2c2d6efac5ea..41705342f4ca 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Meer instellingen"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Gereed"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Verbonden"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Verbonden via wifi-assistent"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Opgeslagen"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Verbinding maken…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"zoeken"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Kan <xliff:g id="APP">%s</xliff:g> niet starten."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Alle apps sluiten"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontaal splitsen"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verticaal splitsen"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Aangepast splitsen"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opgeladen"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Opladen"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot volledig opgeladen"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index e2ef340f194d..72a59445adb1 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Więcej ustawień"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Gotowe"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Połączono"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Połączono przez Asystenta Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Zapisano"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Łączę..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Powiązanie"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Punkt dostępu"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"szukaj"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Nie udało się uruchomić aplikacji <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Zamknij wszystkie aplikacje"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podziel poziomo"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podziel pionowo"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podziel niestandardowo"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Naładowana"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Ładowanie"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do pełnego naładowania"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index df1192d7eced..8f854a6c35b5 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Mais definições"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Concluído"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Ligado"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ligado através do Assistente de Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado(a)"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"A ligar..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Associação"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar o <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Ignorar todas as aplicações"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"A carregar"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até ficar completa"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 770cabef987f..889d3ec58657 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Mais configurações"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Concluído"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado via assistente de Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Salvo"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ponto de acesso"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Dispensar todos os apps"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Carregando"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até concluir"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index cd3a1c0e87ae..159d0be0cb5e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Mai multe setări"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Terminat"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Conectat"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conexiune realizată printr-un asistent Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Salvat"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Se conectează..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"căutare"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> nu a putut porni."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Închideți toate aplicațiile"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divizare pe orizontală"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divizare pe verticală"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divizare personalizată"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"S-a încărcat"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Se încarcă"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> până la încărcare completă"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 7f5d352463ad..3ea47ec47f38 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Настройки"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Подключено"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Установлено подключение через Ассистента Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Сохранено"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Соединение..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступа"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"поиск"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Не удалось запустить приложение \"<xliff:g id="APP">%s</xliff:g>\""</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Закрыть все приложения"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"–"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Разделить по горизонтали"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Разделить по вертикали"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Разделить по-другому"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Батарея заряжена"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядка батареи"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до полной зарядки"</string> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 5bd1f8d493a0..a488050c4132 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"තව සැකසීම්"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"නිමයි"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"සම්බන්ධිත"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi සහායක හරහා සම්බන්ධ කරන ලදි"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"සුරකින ලදි"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"සම්බන්ධ වෙමින්..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ටෙදරින්"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"හොට්ස්පොට්"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"සෙවීම"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ආරම්භ කළ නොහැක."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"සියලුම යෙදුම් අස් කරන්න"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"තිරස්ව වෙන් කරන්න"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"සිරස්ව වෙන් කරන්න"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"අභිමත ලෙස වෙන් කරන්න"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"අරෝපිතයි"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ආරෝපණය වෙමින්"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> සම්පූර්ණ වන තෙක්"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 5183dab51e8c..e9ded7c037b0 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Ďalšie nastavenia"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Pripojené"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Pripojené pomocou Asistenta Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Uložené"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Pripája sa..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľanie dátového pripojenia"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"hľadať"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikáciu <xliff:g id="APP">%s</xliff:g> sa nepodarilo spustiť"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Odmietnuť všetky aplikácie"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Rozdeliť vodorovné"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Rozdeliť zvislé"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Rozdeliť vlastné"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabitá"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíja sa"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Úplné nabitie o <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 2afb65bf6943..89f90e593705 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Več nastavitev"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Končano"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Povezava je vzpostavljena"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Povezava vzpostavljena prek pomočnika za Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Shranjeno"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Vzpostavljanje povezave ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internet prek mobilne naprave"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Dostopna točka"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"iskanje"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacije <xliff:g id="APP">%s</xliff:g> ni bilo mogoče zagnati."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Opusti vse aplikacije"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Razdeli vodoravno"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Razdeli navpično"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Razdeli po meri"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulator napolnjen"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Polnjenje"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do napolnjenosti"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d7ab3a6a641b..ee907ded6bfc 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Још подешавања"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Повезан"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Повезано преко Wi‑Fi помоћника"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Сачувано"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Повезује се..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Повезивање"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хотспот"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"претражи"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Покретање апликације <xliff:g id="APP">%s</xliff:g> није успело."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Одбаци све апликације"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Подели хоризонтално"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Подели вертикално"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Прилагођено дељење"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Напуњена је"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Пуњење"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> док се не напуни"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index f29364907a01..9b9bda018699 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Fler inställningar"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Klart"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Ansluten"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ansluten via Wi-Fi-assistent"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Sparad"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Ansluter ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internetdelning"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Trådlös surfzon"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"sök"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Det gick inte att starta appen <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Ta bort alla appar"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dela horisontellt"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dela vertikalt"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dela anpassad"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laddat"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Laddar"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tills batteriet är fulladdat"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index d7621e9c6eb8..c512731fb461 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Mipangilio zaidi"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Nimemaliza"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Imeunganishwa"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Imeunganishwa kupitia Kisaidizi cha Wi-Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Kilichohifadhiwa"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Inaunganisha..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Kusambaza mtandao"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Mtandao-hewa"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"tafuta"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Haikuweza kuanzisha <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Ondoa programu zote"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gawanya Mlalo"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Gawanya Wima"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Maalum Iliyogawanywa"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Betri imejaa"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Inachaji"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Imebakisha <xliff:g id="CHARGING_TIME">%s</xliff:g> ijae"</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index d861522b7d14..9a08476027c4 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"அமைப்பில் மாற்று"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"முடிந்தது"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"இணைக்கப்பட்டது"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"வைஃபை அசிஸ்டண்ட் மூலம் இணைக்கப்பட்டது"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"சேமிக்கப்பட்டது"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"இணைக்கிறது..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"டெதெரிங்"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ஹாட்ஸ்பாட்"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"தேடு"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ஐத் தொடங்க முடியவில்லை."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"எல்லா பயன்பாடுகளையும் விலக்கு"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"தனிவிருப்பத்தில் பிரி"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"சார்ஜ் செய்யப்பட்டது"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜாகிறது"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"முழுவதும் சார்ஜாக <xliff:g id="CHARGING_TIME">%s</xliff:g> ஆகும்"</string> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index 10b32144271a..595a7f69c8d7 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"మరిన్ని సెట్టింగ్లు"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"పూర్తయింది"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"కనెక్ట్ చేయబడినది"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi సహాయకం ద్వారా కనెక్ట్ చేయబడింది"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"సేవ్ చేయబడింది"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"కనెక్ట్ అవుతోంది..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"టీథరింగ్"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"హాట్స్పాట్"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"శోధించు"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ని ప్రారంభించడం సాధ్యపడలేదు."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"అన్ని అనువర్తనాలను తీసివేయి"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"సమతలంగా విభజించు"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"లంబంగా విభజించు"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"అనుకూలంగా విభజించు"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ఛార్జ్ చేయబడింది"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"ఛార్జ్ అవుతోంది"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"పూర్తిగా నిండటానికి <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 1bc9585f9202..9bc4483eb1dc 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"การตั้งค่าเพิ่มเติม"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"เสร็จสิ้น"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"เชื่อมต่อ"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"เชื่อมต่อผ่านตัวช่วย Wi-Fi อยู่"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"ที่บันทึกไว้"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"กำลังเชื่อมต่อ..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"การปล่อยสัญญาณ"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ฮอตสปอต"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ค้นหา"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"ไม่สามารถเริ่มใช้ <xliff:g id="APP">%s</xliff:g>"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"ปิดแอปพลิเคชันทั้งหมด"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"แยกในแนวนอน"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"แยกในแนวตั้ง"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"แยกแบบกำหนดเอง"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ชาร์จแล้ว"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"กำลังชาร์จ"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"อีก <xliff:g id="CHARGING_TIME">%s</xliff:g> จึงจะเต็ม"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index cee541e225cf..e1c0fcdbe6cb 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Marami pang setting"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Tapos na"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Nakakonekta"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Nakakonekta sa pamamagitan ng Wi‑Fi assistant"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Na-save"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Kumokonekta..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Nagte-tether"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 21f1472e4b8c..29a58795c44e 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Diğer ayarlar"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Bitti"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Bağlı"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Kablosuz bağlantı yardımcısıyla bağlandı"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Kayıtlı"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Bağlanılıyor..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"ara"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> başlatılamadı."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Tüm uygulamaları kapat"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Yatay Ayırma"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dikey Ayırma"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Özel Ayırma"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Ödeme alındı"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Şarj oluyor"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Tam şarj olmasına <xliff:g id="CHARGING_TIME">%s</xliff:g> kaldı"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 0909eaa4b612..3058b94355f4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Більше налаштувань"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Під’єднано"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Під’єднано через Диспетчер Wi-Fi-з’єднання"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Збережено"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"З’єднання…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступу"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"пошук"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Не вдалося запустити <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Закрити всі додатки"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Розділити горизонтально"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Розділити вертикально"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Розділити (власний варіант)"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заряджено"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Заряджається"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"До повного зарядження <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 1b29477f142a..89269ed7765a 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"مزید ترتیبات"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"ہو گیا"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"مربوط"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi اسسٹنٹ کے ذریعے منسلک ہے"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"محفوظ کردہ"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"مربوط ہو رہا ہے…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"مربوط کرنا"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ہاٹ اسپاٹ"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"تلاش کریں"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> کو شروع نہیں کیا جا سکا۔"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"سبھی ایپلیکیشنز کو برخاست کریں"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"بلحاظ افقی الگ کریں"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"بلحاظ عمودی الگ کریں"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"بلحاظ حسب ضرورت الگ کریں"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"چارج ہوگئی"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"چارج ہو رہی ہے"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> مکمل ہونے تک"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 15c84cb524bd..b9941dab8023 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Boshqa sozlamalar"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Tayyor"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Ulangan"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi yordamchisi orqali ulangan"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Saqlandi"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Ulanmoqda…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Modem rejimi"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ulanish nuqtasi"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"qidirish"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"“<xliff:g id="APP">%s</xliff:g>” ilovasini ishga tushirib bo‘lmadi."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Barcha ilovalarni olib tashlash"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gorizontal yo‘nalishda bo‘lish"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikal yo‘nalishda bo‘lish"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Boshqa usulda bo‘lish"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Batareya quvvati to‘ldi"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Quvvat olmoqda"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>da to‘ladi"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 20a19a3601df..8f0c1fcbe639 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Cài đặt khác"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Xong"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Đã kết nối"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Được kết nối qua trình hỗ trợ Wi‑Fi"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Đã lưu"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Đang kết nối..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Đang dùng làm điểm truy cập Internet"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"tìm kiếm"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Không thể khởi động <xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Bỏ qua tất cả các ứng dụng"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Phân tách ngang"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Phân tách dọc"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tùy chỉnh phân tách"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Đã sạc"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Đang sạc"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> cho đến khi đầy"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 0c5c57ba25d4..678654b2b951 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"更多设置"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"已连接"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已连接(通过 WLAN 助手)"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"已保存"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"搜索"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"无法启动<xliff:g id="APP">%s</xliff:g>。"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"关闭所有应用"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自定义分割"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"充电完成"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"正在充电"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"还需<xliff:g id="CHARGING_TIME">%s</xliff:g>充满"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 6e6cc1e9e66c..e35e632cdfba 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"更多設定"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"已連線"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已透過 Wi-Fi 小幫手連線"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"已儲存"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"正在連線…"</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"網絡共享"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"熱點"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"關閉所有應用程式"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"已完成充電"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後完成充電"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 5329977dde08..ac8135b3c495 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -264,8 +264,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"更多設定"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"已連線"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已透過 Wi‑Fi 小幫手連線"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"已儲存"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"連線中..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"網路共用"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"無線基地台"</string> @@ -284,18 +282,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"關閉所有應用程式"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"已充飽"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後充飽"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2a7adb5387f2..a91d76c7c6a7 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -262,8 +262,6 @@      <string name="quick_settings_more_settings" msgid="326112621462813682">"Izilungiselelo eziningi"</string>      <string name="quick_settings_done" msgid="3402999958839153376">"Kwenziwe"</string>      <string name="quick_settings_connected" msgid="1722253542984847487">"Ixhunyiwe"</string> -    <string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ixhunywe ngomsizi we-Wi-FI"</string> -    <string name="quick_settings_saved" msgid="4758747300943481411">"Ilondoloziwe"</string>      <string name="quick_settings_connecting" msgid="47623027419264404">"Iyaxhuma..."</string>      <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ukusebenzisa njengemodemu"</string>      <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"I-Hotspot"</string> @@ -282,18 +280,12 @@      <string name="recents_search_bar_label" msgid="8074997400187836677">"sesha"</string>      <string name="recents_launch_error_message" msgid="2969287838120550506">"Ayikwazanga ukuqala i-<xliff:g id="APP">%s</xliff:g>."</string>      <string name="recents_dismiss_all_message" msgid="8495275386693095768">"Cashisa zonke izinhlelo zokusebenza"</string> -    <!-- no translation found for recents_multistack_add_stack (5044995965068125420) --> -    <skip /> -    <!-- no translation found for recents_multistack_remove_stack (3014058144068028841) --> -    <skip /> -    <!-- no translation found for recents_multistack_resize_stack (5511174284568497822) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> -    <skip /> -    <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> -    <skip /> +    <string name="recents_multistack_add_stack" msgid="5044995965068125420">"+"</string> +    <string name="recents_multistack_remove_stack" msgid="3014058144068028841">"-"</string> +    <string name="recents_multistack_resize_stack" msgid="5511174284568497822">"[]"</string> +    <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Hlukanisa okuvundlile"</string> +    <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Hlukanisa okumile"</string> +    <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Hlukanisa kwezifiso"</string>      <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kushajiwe"</string>      <string name="expanded_header_battery_charging" msgid="205623198487189724">"Iyashaja"</string>      <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ize igcwale"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 2659009364fc..8a73fcaf1082 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -146,6 +146,9 @@       before the app can interrupt again. -->      <integer name="heads_up_default_snooze_length_ms">60000</integer> +    <!-- Minimum display time for a heads up notification, in milliseconds. --> +    <integer name="heads_up_notification_minimum_time">3000</integer> +      <!-- milliseconds before the heads up notification accepts touches. -->      <integer name="heads_up_sensitivity_delay">700</integer> @@ -241,10 +244,10 @@      <bool name="doze_pulse_on_notifications">true</bool>      <!-- Doze: when to pulse after a buzzworthy notification arrives --> -    <string name="doze_pulse_schedule" translatable="false">1s,10s,30s,60s,120s</string> +    <string name="doze_pulse_schedule" translatable="false">1s,10s,30s,60s</string>      <!-- Doze: maximum number of times the notification pulse schedule can be reset --> -    <integer name="doze_pulse_schedule_resets">3</integer> +    <integer name="doze_pulse_schedule_resets">2</integer>      <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations -->      <integer name="doze_pickup_vibration_threshold">2000</integer> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index a0ea25f518f4..ca5434978d04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -127,7 +127,6 @@ public abstract class BaseStatusBar extends SystemUI implements      protected static final int MSG_SHOW_HEADS_UP = 1028;      protected static final int MSG_HIDE_HEADS_UP = 1029;      protected static final int MSG_ESCALATE_HEADS_UP = 1030; -    protected static final int MSG_DECAY_HEADS_UP = 1031;      protected static final boolean ENABLE_HEADS_UP = true;      // scores above this threshold should be displayed in heads up mode. @@ -1153,7 +1152,7 @@ public abstract class BaseStatusBar extends SystemUI implements          // Do nothing      } -    public abstract void resetHeadsUpDecayTimer(); +    public abstract void scheduleHeadsUpDecay(long delay);      public abstract void scheduleHeadsUpOpen(); @@ -1182,14 +1181,15 @@ public abstract class BaseStatusBar extends SystemUI implements          }          if (mUsersAllowingPrivateNotifications.indexOfKey(userHandle) < 0) { -            final boolean allowed = 0 != Settings.Secure.getIntForUser( +            final boolean allowedByUser = 0 != Settings.Secure.getIntForUser(                      mContext.getContentResolver(),                      Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userHandle);              final int dpmFlags = mDevicePolicyManager.getKeyguardDisabledFeatures(null /* admin */,                      userHandle);              final boolean allowedByDpm = (dpmFlags                      & DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS) == 0; -            mUsersAllowingPrivateNotifications.append(userHandle, allowed && allowedByDpm); +            final boolean allowed = allowedByUser && allowedByDpm; +            mUsersAllowingPrivateNotifications.append(userHandle, allowed);              return allowed;          } @@ -1353,8 +1353,7 @@ public abstract class BaseStatusBar extends SystemUI implements          PendingIntent contentIntent = sbn.getNotification().contentIntent;          if (contentIntent != null) { -            final View.OnClickListener listener = makeClicker(contentIntent, sbn.getKey(), -                    isHeadsUp); +            final View.OnClickListener listener = makeClicker(contentIntent, sbn.getKey());              row.setOnClickListener(listener);          } else {              row.setOnClickListener(null); @@ -1515,20 +1514,17 @@ public abstract class BaseStatusBar extends SystemUI implements          return true;      } -    public NotificationClicker makeClicker(PendingIntent intent, String notificationKey, -            boolean forHun) { -        return new NotificationClicker(intent, notificationKey, forHun); +    public NotificationClicker makeClicker(PendingIntent intent, String notificationKey) { +        return new NotificationClicker(intent, notificationKey);      }      protected class NotificationClicker implements View.OnClickListener {          private PendingIntent mIntent;          private final String mNotificationKey; -        private boolean mIsHeadsUp; -        public NotificationClicker(PendingIntent intent, String notificationKey, boolean forHun) { +        public NotificationClicker(PendingIntent intent, String notificationKey) {              mIntent = intent;              mNotificationKey = notificationKey; -            mIsHeadsUp = forHun;          }          public void onClick(final View v) { @@ -1541,12 +1537,12 @@ public abstract class BaseStatusBar extends SystemUI implements                              mCurrentUserId);              dismissKeyguardThenExecute(new OnDismissAction() {                  public boolean onDismiss() { -                    if (mIsHeadsUp) { +                    if (mNotificationKey.equals(mHeadsUpNotificationView.getKey())) {                          // Release the HUN notification to the shade.                          //                          // In most cases, when FLAG_AUTO_CANCEL is set, the notification will                          // become canceled shortly by NoMan, but we can't assume that. -                        mHeadsUpNotificationView.releaseAndClose(); +                        mHeadsUpNotificationView.releaseImmediately();                      }                      new Thread() {                          @Override @@ -1893,7 +1889,7 @@ public abstract class BaseStatusBar extends SystemUI implements                          && oldPublicContentView.getLayoutId() == publicContentView.getLayoutId());          final boolean shouldInterrupt = shouldInterrupt(notification); -        final boolean alertAgain = alertAgain(oldEntry, n); +        final boolean alertAgain = shouldInterrupt && alertAgain(oldEntry, n);          boolean updateSuccessful = false;          if (contentsUnchanged && bigContentsUnchanged && headsUpContentsUnchanged                  && publicUnchanged) { @@ -1916,14 +1912,12 @@ public abstract class BaseStatusBar extends SystemUI implements                  }                  if (wasHeadsUp) { -                    if (shouldInterrupt) { -                        updateHeadsUpViews(oldEntry, notification); -                        if (alertAgain) { -                            resetHeadsUpDecayTimer(); -                        } -                    } else { +                    // Release may hang on to the views for a bit, so we should always update them. +                    updateHeadsUpViews(oldEntry, notification); +                    mHeadsUpNotificationView.updateNotification(oldEntry, alertAgain); +                    if (!shouldInterrupt) {                          // we updated the notification above, so release to build a new shade entry -                        mHeadsUpNotificationView.releaseAndClose(); +                        mHeadsUpNotificationView.release();                          return;                      }                  } else { @@ -1946,23 +1940,19 @@ public abstract class BaseStatusBar extends SystemUI implements          if (!updateSuccessful) {              if (DEBUG) Log.d(TAG, "not reusing notification for key: " + key);              if (wasHeadsUp) { -                if (shouldInterrupt) { -                    if (DEBUG) Log.d(TAG, "rebuilding heads up for key: " + key); -                    Entry newEntry = new Entry(notification, null); -                    ViewGroup holder = mHeadsUpNotificationView.getHolder(); -                    if (inflateViewsForHeadsUp(newEntry, holder)) { -                        mHeadsUpNotificationView.showNotification(newEntry); -                        if (alertAgain) { -                            resetHeadsUpDecayTimer(); -                        } -                    } else { -                        Log.w(TAG, "Couldn't create new updated headsup for package " -                                + contentView.getPackage()); -                    } +                if (DEBUG) Log.d(TAG, "rebuilding heads up for key: " + key); +                Entry newEntry = new Entry(notification, null); +                ViewGroup holder = mHeadsUpNotificationView.getHolder(); +                if (inflateViewsForHeadsUp(newEntry, holder)) { +                    mHeadsUpNotificationView.updateNotification(newEntry, alertAgain);                  } else { +                    Log.w(TAG, "Couldn't create new updated headsup for package " +                            + contentView.getPackage()); +                } +                if (!shouldInterrupt) {                      if (DEBUG) Log.d(TAG, "releasing heads up for key: " + key);                      oldEntry.notification = notification; -                    mHeadsUpNotificationView.releaseAndClose(); +                    mHeadsUpNotificationView.release();                      return;                  }              } else { @@ -2032,8 +2022,7 @@ public abstract class BaseStatusBar extends SystemUI implements          // update the contentIntent          final PendingIntent contentIntent = notification.getNotification().contentIntent;          if (contentIntent != null) { -            final View.OnClickListener listener = makeClicker(contentIntent, notification.getKey(), -                    isHeadsUp); +            final View.OnClickListener listener = makeClicker(contentIntent, notification.getKey());              entry.row.setOnClickListener(listener);          } else {              entry.row.setOnClickListener(null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 3ee7fb2d422e..ece69d3a8481 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -361,7 +361,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,                  if (!mUseHeadsUp) {                      Log.d(TAG, "dismissing any existing heads up notification on disable event");                      setHeadsUpVisibility(false); -                    mHeadsUpNotificationView.release(); +                    mHeadsUpNotificationView.releaseImmediately();                      removeHeadsUpView();                  } else {                      addHeadsUpView(); @@ -1213,33 +1213,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,      }      @Override -    public void resetHeadsUpDecayTimer() { -        mHandler.removeMessages(MSG_DECAY_HEADS_UP); -        if (mUseHeadsUp && mHeadsUpNotificationDecay > 0 -                && mHeadsUpNotificationView.isClearable()) { -            mHandler.sendEmptyMessageDelayed(MSG_DECAY_HEADS_UP, mHeadsUpNotificationDecay); -        } -    } - -    @Override -    public void scheduleHeadsUpOpen() { -        mHandler.removeMessages(MSG_SHOW_HEADS_UP); -        mHandler.sendEmptyMessage(MSG_SHOW_HEADS_UP); -    } - -    @Override -    public void scheduleHeadsUpClose() { -        mHandler.removeMessages(MSG_HIDE_HEADS_UP); -        mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP); -    } - -    @Override -    public void scheduleHeadsUpEscalation() { -        mHandler.removeMessages(MSG_ESCALATE_HEADS_UP); -        mHandler.sendEmptyMessage(MSG_ESCALATE_HEADS_UP); -    } - -    @Override      protected void updateNotificationRanking(RankingMap ranking) {          mNotificationData.updateRanking(ranking);          updateNotifications(); @@ -1247,9 +1220,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,      @Override      public void removeNotification(String key, RankingMap ranking) { -        if (ENABLE_HEADS_UP && mHeadsUpNotificationView.getEntry() != null -                && key.equals(mHeadsUpNotificationView.getEntry().notification.getKey())) { -            mHeadsUpNotificationView.clear(); +        if (ENABLE_HEADS_UP) { +            mHeadsUpNotificationView.removeNotification(key);          }          StatusBarNotification old = removeNotificationViews(key, ranking); @@ -1870,16 +1842,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,                  case MSG_SHOW_HEADS_UP:                      setHeadsUpVisibility(true);                      break; -                case MSG_DECAY_HEADS_UP: -                    mHeadsUpNotificationView.release(); -                    setHeadsUpVisibility(false); -                    break; -                case MSG_HIDE_HEADS_UP: -                    mHeadsUpNotificationView.release(); -                    setHeadsUpVisibility(false); -                    break;                  case MSG_ESCALATE_HEADS_UP:                      escalateHeadsUp(); +                case MSG_HIDE_HEADS_UP: +                    mHeadsUpNotificationView.releaseImmediately();                      setHeadsUpVisibility(false);                      break;                  case MSG_LAUNCH_TRANSITION_TIMEOUT: @@ -1889,11 +1855,41 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,          }      } +    @Override +    public void scheduleHeadsUpDecay(long delay) { +        mHandler.removeMessages(MSG_HIDE_HEADS_UP); +        if (mHeadsUpNotificationView.isClearable()) { +            mHandler.sendEmptyMessageDelayed(MSG_HIDE_HEADS_UP, delay); +        } +    } + +    @Override +    public void scheduleHeadsUpOpen() { +        mHandler.removeMessages(MSG_HIDE_HEADS_UP); +        mHandler.removeMessages(MSG_SHOW_HEADS_UP); +        mHandler.sendEmptyMessage(MSG_SHOW_HEADS_UP); +    } + +    @Override +    public void scheduleHeadsUpClose() { +        mHandler.removeMessages(MSG_HIDE_HEADS_UP); +        if (mHeadsUpNotificationView.getVisibility() != View.GONE) { +            mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP); +        } +    } + +    @Override +    public void scheduleHeadsUpEscalation() { +        mHandler.removeMessages(MSG_HIDE_HEADS_UP); +        mHandler.removeMessages(MSG_ESCALATE_HEADS_UP); +        mHandler.sendEmptyMessage(MSG_ESCALATE_HEADS_UP); +    } +      /**  if the interrupting notification had a fullscreen intent, fire it now.  */      private void escalateHeadsUp() {          if (mHeadsUpNotificationView.getEntry() != null) {              final StatusBarNotification sbn = mHeadsUpNotificationView.getEntry().notification; -            mHeadsUpNotificationView.release(); +            mHeadsUpNotificationView.releaseImmediately();              final Notification notification = sbn.getNotification();              if (notification.fullScreenIntent != null) {                  if (DEBUG) @@ -2734,10 +2730,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,          mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE);      } -    public void onHeadsUpDismissed() { -        mHeadsUpNotificationView.dismiss(); -    } -      /**       * Reload some of our resources when the configuration changes.       * @@ -2772,7 +2764,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,          mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); -        mHeadsUpNotificationDecay = res.getInteger(R.integer.heads_up_notification_decay);          mRowMinHeight =  res.getDimensionPixelSize(R.dimen.notification_min_height);          mRowMaxHeight =  res.getDimensionPixelSize(R.dimen.notification_max_height); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java index 2e96dd5e4e69..1566cd1bdc57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java @@ -25,6 +25,9 @@ import android.graphics.Rect;  import android.os.SystemClock;  import android.provider.Settings;  import android.util.ArrayMap; +import android.graphics.Outline; +import android.graphics.Rect; +import android.os.SystemClock;  import android.util.AttributeSet;  import android.util.Log;  import android.view.MotionEvent; @@ -36,6 +39,7 @@ import android.view.ViewTreeObserver;  import android.view.accessibility.AccessibilityEvent;  import android.widget.FrameLayout; +import com.android.internal.annotations.VisibleForTesting;  import com.android.systemui.ExpandHelper;  import com.android.systemui.Gefingerpoken;  import com.android.systemui.R; @@ -58,6 +62,9 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      Rect mTmpRect = new Rect();      int[] mTmpTwoArray = new int[2]; +    private final int mHeadsUpNotificationDecay; +    private final int mMinimumDisplayTime; +      private final int mTouchSensitivityDelay;      private final float mMaxAlpha = 1f;      private final ArrayMap<String, Long> mSnoozedPackages; @@ -68,6 +75,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      private PhoneStatusBar mBar; +    private long mLingerUntilMs;      private long mStartTouchTime;      private ViewGroup mContentHolder;      private int mSnoozeLengthMs; @@ -76,6 +84,14 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      private NotificationData.Entry mHeadsUp;      private int mUser;      private String mMostRecentPackageName; +    private boolean mTouched; +    private Clock mClock; + +    public static class Clock { +        public long currentTimeMillis() { +            return SystemClock.elapsedRealtime(); +        } +    }      public HeadsUpNotificationView(Context context, AttributeSet attrs) {          this(context, attrs, 0); @@ -89,6 +105,24 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          mSnoozedPackages = new ArrayMap<>();          mDefaultSnoozeLengthMs = resources.getInteger(R.integer.heads_up_default_snooze_length_ms);          mSnoozeLengthMs = mDefaultSnoozeLengthMs; +        mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time); +        mHeadsUpNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay); +        mClock = new Clock(); +    } + +    @VisibleForTesting +    public HeadsUpNotificationView(Context context, Clock clock, SwipeHelper swipeHelper, +            EdgeSwipeHelper edgeSwipeHelper, int headsUpNotificationDecay, int minimumDisplayTime, +            int touchSensitivityDelay, int snoozeLength) { +        super(context, null); +        mClock = clock; +        mSwipeHelper = swipeHelper; +        mEdgeSwipeHelper = edgeSwipeHelper; +        mMinimumDisplayTime = minimumDisplayTime; +        mHeadsUpNotificationDecay = headsUpNotificationDecay; +        mTouchSensitivityDelay = touchSensitivityDelay; +        mSnoozedPackages = new ArrayMap<>(); +        mDefaultSnoozeLengthMs = snoozeLength;      }      public void updateResources() { @@ -104,88 +138,139 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          mBar = bar;      } +    public PhoneStatusBar getBar() { +        return mBar; +    } +      public ViewGroup getHolder() {          return mContentHolder;      } -    public boolean showNotification(NotificationData.Entry headsUp) { -        if (mHeadsUp != null && headsUp != null && !mHeadsUp.key.equals(headsUp.key)) { +    /** +     * Called when posting a new notification to the heads up. +     */ +    public void showNotification(NotificationData.Entry headsUp) { +        if (DEBUG) Log.v(TAG, "showNotification"); +        if (mHeadsUp != null) {              // bump any previous heads up back to the shade -            release(); +            releaseImmediately(); +        } +        mTouched = false; +        updateNotification(headsUp, true); +        mLingerUntilMs = mClock.currentTimeMillis() + mMinimumDisplayTime; +    } + +    /** +     * Called when updating or posting a notification to the heads up. +     */ +    public void updateNotification(NotificationData.Entry headsUp, boolean alert) { +        if (DEBUG) Log.v(TAG, "updateNotification"); + +        if (alert) { +            mBar.scheduleHeadsUpDecay(mHeadsUpNotificationDecay); +        } +        invalidate(); + +        if (mHeadsUp == headsUp) { +            // This is an in-place update.  Noting more to do. +            return;          }          mHeadsUp = headsUp; +          if (mContentHolder != null) {              mContentHolder.removeAllViews();          }          if (mHeadsUp != null) {              mMostRecentPackageName = mHeadsUp.notification.getPackageName(); -            mHeadsUp.row.setSystemExpanded(true); -            mHeadsUp.row.setSensitive(false); -            mHeadsUp.row.setHeadsUp(true); -            mHeadsUp.row.setHideSensitive( -                    false, false /* animated */, 0 /* delay */, 0 /* duration */); -            if (mContentHolder == null) { -                // too soon! -                return false; +            if (mHeadsUp.row != null) {  // only null in tests +                mHeadsUp.row.setSystemExpanded(true); +                mHeadsUp.row.setSensitive(false); +                mHeadsUp.row.setHeadsUp(true); +                mHeadsUp.row.setHideSensitive( +                        false, false /* animated */, 0 /* delay */, 0 /* duration */);              } -            mContentHolder.setX(0); -            mContentHolder.setVisibility(View.VISIBLE); -            mContentHolder.setAlpha(mMaxAlpha); -            mContentHolder.addView(mHeadsUp.row); -            sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); -            mSwipeHelper.snapChild(mContentHolder, 1f);              mStartTouchTime = SystemClock.elapsedRealtime() + mTouchSensitivityDelay; +            if (mContentHolder != null) {  // only null in tests and before we are attached to a window +                mContentHolder.setX(0); +                mContentHolder.setVisibility(View.VISIBLE); +                mContentHolder.setAlpha(mMaxAlpha); +                mContentHolder.addView(mHeadsUp.row); +                sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + +                mSwipeHelper.snapChild(mContentHolder, 1f); +            }              mHeadsUp.setInterruption(); -            // 2. Animate mHeadsUpNotificationView in +            // Make sure the heads up window is open.              mBar.scheduleHeadsUpOpen(); - -            // 3. Set alarm to age the notification off -            mBar.resetHeadsUpDecayTimer();          } -        return true;      } -    @Override -    protected void onVisibilityChanged(View changedView, int visibility) { -        super.onVisibilityChanged(changedView, visibility); -        if (changedView.getVisibility() == VISIBLE) { -            sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); +    /** +     * Possibly enter the lingering state by delaying the closing of the window. +     * +     * @return true if the notification has entered the lingering state. +     */ +    private boolean startLingering(boolean removed) { +        final long now = mClock.currentTimeMillis(); +        if (!mTouched && mHeadsUp != null && now < mLingerUntilMs) { +            if (removed) { +                mHeadsUp = null; +            } +            mBar.scheduleHeadsUpDecay(mLingerUntilMs - now); +            return true;          } +        return false;      } -    public boolean isShowing(String key) { -        return mHeadsUp != null && mHeadsUp.key.equals(key); +    /** +     * React to the removal of the notification in the heads up. +     */ +    public void removeNotification(String key) { +        if (DEBUG) Log.v(TAG, "remove"); +        if (mHeadsUp == null || !mHeadsUp.key.equals(key)) { +            return; +        } +        if (!startLingering(/* removed */ true)) { +            mHeadsUp = null; +            releaseImmediately(); +        }      } -    /** Discard the Heads Up notification. */ -    public void clear() { -        mHeadsUp = null; -        mBar.scheduleHeadsUpClose(); +    /** +     * Ask for any current Heads Up notification to be pushed down into the shade. +     */ +    public void release() { +        if (DEBUG) Log.v(TAG, "release"); +        if (!startLingering(/* removed */ false)) { +            releaseImmediately(); +        }      } -    /** Respond to dismissal of the Heads Up window. */ -    public void dismiss() { -        if (mHeadsUp == null) return; -        if (mHeadsUp.notification.isClearable()) { -            mBar.onNotificationClear(mHeadsUp.notification); -        } else { -            release(); +    /** +     * Push any current Heads Up notification down into the shade. +     */ +    public void releaseImmediately() { +        if (DEBUG) Log.v(TAG, "releaseImmediately"); +        if (mHeadsUp != null) { +            mBar.displayNotificationFromHeadsUp(mHeadsUp.notification);          }          mHeadsUp = null;          mBar.scheduleHeadsUpClose();      } -    /** Push any current Heads Up notification down into the shade. */ -    public void release() { -        if (mHeadsUp != null) { -            mBar.displayNotificationFromHeadsUp(mHeadsUp.notification); +    @Override +    protected void onVisibilityChanged(View changedView, int visibility) { +        super.onVisibilityChanged(changedView, visibility); +        if (DEBUG) Log.v(TAG, "onVisibilityChanged: " + visibility); +        if (changedView.getVisibility() == VISIBLE) { +            mStartTouchTime = mClock.currentTimeMillis() + mTouchSensitivityDelay; +            sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);          } -        mHeadsUp = null;      }      public boolean isSnoozed(String packageName) { @@ -206,16 +291,15 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.              mSnoozedPackages.put(snoozeKey(mMostRecentPackageName, mUser),                      SystemClock.elapsedRealtime() + mSnoozeLengthMs);          } -        releaseAndClose(); +        releaseImmediately();      }      private static String snoozeKey(String packageName, int user) {          return user + "," + packageName;      } -    public void releaseAndClose() { -        release(); -        mBar.scheduleHeadsUpClose(); +    public boolean isShowing(String key) { +        return mHeadsUp != null && mHeadsUp.key.equals(key);      }      public NotificationData.Entry getEntry() { @@ -228,19 +312,19 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      // ViewGroup methods -    private static final ViewOutlineProvider CONTENT_HOLDER_OUTLINE_PROVIDER = -            new ViewOutlineProvider() { -        @Override -        public void getOutline(View view, Outline outline) { -            int outlineLeft = view.getPaddingLeft(); -            int outlineTop = view.getPaddingTop(); - -            // Apply padding to shadow. -            outline.setRect(outlineLeft, outlineTop, -                    view.getWidth() - outlineLeft - view.getPaddingRight(), -                    view.getHeight() - outlineTop - view.getPaddingBottom()); -        } -    }; +private static final ViewOutlineProvider CONTENT_HOLDER_OUTLINE_PROVIDER = +        new ViewOutlineProvider() { +            @Override +            public void getOutline(View view, Outline outline) { +                int outlineLeft = view.getPaddingLeft(); +                int outlineTop = view.getPaddingTop(); + +                // Apply padding to shadow. +                outline.setRect(outlineLeft, outlineTop, +                        view.getWidth() - outlineLeft - view.getPaddingRight(), +                        view.getHeight() - outlineTop - view.getPaddingBottom()); +            } +        };      @Override      public void onAttachedToWindow() { @@ -248,7 +332,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          float touchSlop = viewConfiguration.getScaledTouchSlop();          mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, getContext());          mSwipeHelper.setMaxSwipeProgress(mMaxAlpha); -        mEdgeSwipeHelper = new EdgeSwipeHelper(touchSlop); +        mEdgeSwipeHelper = new EdgeSwipeHelper(this, touchSlop);          int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height);          int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_max_height); @@ -282,6 +366,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          getViewTreeObserver().addOnComputeInternalInsetsListener(this);      } +      @Override      protected void onDetachedFromWindow() {          mContext.getContentResolver().unregisterContentObserver(mSettingsObserver); @@ -290,11 +375,13 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      @Override      public boolean onInterceptTouchEvent(MotionEvent ev) {          if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); -        if (SystemClock.elapsedRealtime() < mStartTouchTime) { +        if (mClock.currentTimeMillis() < mStartTouchTime) {              return true;          } +        mTouched = true;          return mEdgeSwipeHelper.onInterceptTouchEvent(ev)                  || mSwipeHelper.onInterceptTouchEvent(ev) +                || mHeadsUp == null // lingering                  || super.onInterceptTouchEvent(ev);      } @@ -316,12 +403,17 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      @Override      public boolean onTouchEvent(MotionEvent ev) { -        if (SystemClock.elapsedRealtime() < mStartTouchTime) { +        if (mClock.currentTimeMillis() < mStartTouchTime) {              return false;          } -        mBar.resetHeadsUpDecayTimer(); + +        final boolean wasRemoved = mHeadsUp == null; +        if (!wasRemoved) { +            mBar.scheduleHeadsUpDecay(mHeadsUpNotificationDecay); +        }          return mEdgeSwipeHelper.onTouchEvent(ev)                  || mSwipeHelper.onTouchEvent(ev) +                || wasRemoved                  || super.onTouchEvent(ev);      } @@ -390,7 +482,11 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.      @Override      public void onChildDismissed(View v) {          Log.v(TAG, "User swiped heads up to dismiss"); -        mBar.onHeadsUpDismissed(); +        if (mHeadsUp != null && mHeadsUp.notification.isClearable()) { +            mBar.onNotificationClear(mHeadsUp.notification); +            mHeadsUp = null; +        } +        releaseImmediately();      }      @Override @@ -448,6 +544,8 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          pw.println("HeadsUpNotificationView state:");          pw.print("  mTouchSensitivityDelay="); pw.println(mTouchSensitivityDelay);          pw.print("  mSnoozeLengthMs="); pw.println(mSnoozeLengthMs); +        pw.print("  mLingerUntilMs="); pw.println(mLingerUntilMs); +        pw.print("  mTouched="); pw.println(mTouched);          pw.print("  mMostRecentPackageName="); pw.println(mMostRecentPackageName);          pw.print("  mStartTouchTime="); pw.println(mStartTouchTime);          pw.print("  now="); pw.println(SystemClock.elapsedRealtime()); @@ -465,14 +563,16 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.          }      } -    private class EdgeSwipeHelper implements Gefingerpoken { +    public static class EdgeSwipeHelper implements Gefingerpoken {          private static final boolean DEBUG_EDGE_SWIPE = false;          private final float mTouchSlop; +        private final HeadsUpNotificationView mHeadsUpView;          private boolean mConsuming;          private float mFirstY;          private float mFirstX; -        public EdgeSwipeHelper(float touchSlop) { +        public EdgeSwipeHelper(HeadsUpNotificationView headsUpView, float touchSlop) { +            mHeadsUpView = headsUpView;              mTouchSlop = touchSlop;          } @@ -492,10 +592,10 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.                      final float daX = Math.abs(ev.getX() - mFirstX);                      final float daY = Math.abs(dY);                      if (!mConsuming && daX < daY && daY > mTouchSlop) { -                        snooze(); +                        mHeadsUpView.snooze();                          if (dY > 0) {                              if (DEBUG_EDGE_SWIPE) Log.d(TAG, "found an open"); -                            mBar.animateExpandNotificationsPanel(); +                            mHeadsUpView.getBar().animateExpandNotificationsPanel();                          }                          mConsuming = true;                      } @@ -503,7 +603,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.                  case MotionEvent.ACTION_UP:                  case MotionEvent.ACTION_CANCEL: -                    if (DEBUG_EDGE_SWIPE) Log.d(TAG, "action done" ); +                    if (DEBUG_EDGE_SWIPE) Log.d(TAG, "action done");                      mConsuming = false;                      break;              } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java index 600b75087e0d..0e21457a6547 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java @@ -31,6 +31,7 @@ public interface ZenModeController {      void setUserId(int userId);      boolean isZenAvailable();      ComponentName getEffectsSuppressor(); +    boolean isCountdownConditionSupported();      public static class Callback {          public void onZenChanged(int zen) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 37ed7d8c6b6a..dbdb57827049 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -169,6 +169,12 @@ public class ZenModeControllerImpl implements ZenModeController {          return NotificationManager.from(mContext).getEffectsSuppressor();      } +    @Override +    public boolean isCountdownConditionSupported() { +        return NotificationManager.from(mContext) +                .isSystemConditionProviderEnabled(ZenModeConfig.COUNTDOWN_PATH); +    } +      private void fireNextAlarmChanged() {          for (Callback cb : mCallbacks) {              cb.onNextAlarmChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index 0a14cf5a34c1..6f2a3924a708 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -127,7 +127,7 @@ public class TvStatusBar extends BaseStatusBar {      }      @Override -    public void resetHeadsUpDecayTimer() { +    public void scheduleHeadsUpDecay(long delay) {      }      @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java index acdcfc190740..31264eed49a4 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java @@ -37,7 +37,6 @@ import android.graphics.PixelFormat;  import android.graphics.drawable.ColorDrawable;  import android.media.AudioAttributes;  import android.media.AudioManager; -import android.media.AudioService;  import android.media.AudioSystem;  import android.media.RingtoneManager;  import android.media.ToneGenerator; @@ -88,7 +87,7 @@ public class VolumePanel extends Handler implements DemoMode {      private static final String TAG = "VolumePanel";      private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG); -    private static final int PLAY_SOUND_DELAY = AudioService.PLAY_SOUND_DELAY; +    private static final int PLAY_SOUND_DELAY = AudioSystem.PLAY_SOUND_DELAY;      /**       * The delay before vibrating. This small period exists so if the user is @@ -351,6 +350,17 @@ public class VolumePanel extends Handler implements DemoMode {          };      } +    protected LayoutParams getDialogLayoutParams(Window window, Resources res) { +        final LayoutParams lp = window.getAttributes(); +        lp.token = null; +        lp.y = res.getDimensionPixelOffset(com.android.systemui.R.dimen.volume_panel_top); +        lp.type = LayoutParams.TYPE_STATUS_BAR_PANEL; +        lp.format = PixelFormat.TRANSLUCENT; +        lp.windowAnimations = com.android.systemui.R.style.VolumePanelAnimation; +        lp.setTitle(TAG); +        return lp; +    } +      public VolumePanel(Context context, ZenModeController zenController) {          mTag = String.format("%s.%08x", TAG, hashCode());          mContext = context; @@ -409,14 +419,7 @@ public class VolumePanel extends Handler implements DemoMode {          mDialog.create(); -        final LayoutParams lp = window.getAttributes(); -        lp.token = null; -        lp.y = res.getDimensionPixelOffset(com.android.systemui.R.dimen.volume_panel_top); -        lp.type = LayoutParams.TYPE_STATUS_BAR_PANEL; -        lp.format = PixelFormat.TRANSLUCENT; -        lp.windowAnimations = com.android.systemui.R.style.VolumePanelAnimation; -        lp.setTitle(TAG); -        window.setAttributes(lp); +        window.setAttributes(getDialogLayoutParams(window, res));          updateWidth(); @@ -602,7 +605,7 @@ public class VolumePanel extends Handler implements DemoMode {      private int getStreamVolume(int streamType) {          if (streamType == STREAM_MASTER) { -            return mAudioManager.getMasterVolume(); +            return mAudioManager.getLastAudibleMasterVolume();          } else if (streamType == STREAM_REMOTE_MUSIC) {              if (mStreamControls != null) {                  StreamControl sc = mStreamControls.get(streamType); @@ -613,7 +616,7 @@ public class VolumePanel extends Handler implements DemoMode {              }              return -1;          } else { -            return mAudioManager.getStreamVolume(streamType); +            return mAudioManager.getLastAudibleStreamVolume(streamType);          }      } @@ -1012,7 +1015,7 @@ public class VolumePanel extends Handler implements DemoMode {      }      private static String streamToString(int stream) { -        return AudioService.streamToString(stream); +        return AudioSystem.streamToString(stream);      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index d40a2c050698..5726fa7b0a42 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -19,7 +19,6 @@ package com.android.systemui.volume;  import android.animation.LayoutTransition;  import android.animation.LayoutTransition.TransitionListener;  import android.app.ActivityManager; -import android.app.NotificationManager;  import android.content.Context;  import android.content.Intent;  import android.content.SharedPreferences; @@ -85,10 +84,6 @@ public class ZenModePanel extends LinearLayout {      private final int mSubheadWarningColor;      private final int mSubheadColor;      private final Interpolator mInterpolator; -    private final int mMaxConditions; -    private final int mMaxOptionalConditions; -    private final boolean mCountdownConditionSupported; -    private final int mFirstConditionIndex;      private final TransitionHelper mTransitionHelper = new TransitionHelper();      private final Uri mForeverId; @@ -103,6 +98,10 @@ public class ZenModePanel extends LinearLayout {      private Callback mCallback;      private ZenModeController mController; +    private boolean mCountdownConditionSupported; +    private int mMaxConditions; +    private int mMaxOptionalConditions; +    private int mFirstConditionIndex;      private boolean mRequestingConditions;      private Condition mExitCondition;      private String mExitConditionText; @@ -127,14 +126,6 @@ public class ZenModePanel extends LinearLayout {          mSubheadColor = res.getColor(R.color.qs_subhead);          mInterpolator = AnimationUtils.loadInterpolator(mContext,                  com.android.internal.R.interpolator.fast_out_slow_in); -        mCountdownConditionSupported = NotificationManager.from(mContext) -                .isSystemConditionProviderEnabled(ZenModeConfig.COUNTDOWN_PATH); -        final int countdownDelta = mCountdownConditionSupported ? 1 : 0; -        mFirstConditionIndex = COUNTDOWN_CONDITION_INDEX + countdownDelta; -        final int minConditions = 1 /*forever*/ + countdownDelta; -        mMaxConditions = MathUtils.constrain(res.getInteger(R.integer.zen_mode_max_conditions), -                minConditions, 100); -        mMaxOptionalConditions = mMaxConditions - minConditions;          mForeverId = Condition.newId(mContext).appendPath("forever").build();          if (DEBUG) Log.d(mTag, "new ZenModePanel");      } @@ -192,9 +183,6 @@ public class ZenModePanel extends LinearLayout {          Interaction.register(mMoreSettings, mInteractionCallback);          mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions); -        for (int i = 0; i < mMaxConditions; i++) { -            mZenConditions.addView(mInflater.inflate(R.layout.zen_mode_condition, this, false)); -        }          setLayoutTransition(newLayoutTransition(mTransitionHelper));      } @@ -306,6 +294,16 @@ public class ZenModePanel extends LinearLayout {      public void init(ZenModeController controller) {          mController = controller; +        mCountdownConditionSupported = mController.isCountdownConditionSupported(); +        final int countdownDelta = mCountdownConditionSupported ? 1 : 0; +        mFirstConditionIndex = COUNTDOWN_CONDITION_INDEX + countdownDelta; +        final int minConditions = 1 /*forever*/ + countdownDelta; +        mMaxConditions = MathUtils.constrain(mContext.getResources() +                .getInteger(R.integer.zen_mode_max_conditions), minConditions, 100); +        mMaxOptionalConditions = mMaxConditions - minConditions; +        for (int i = 0; i < mMaxConditions; i++) { +            mZenConditions.addView(mInflater.inflate(R.layout.zen_mode_condition, this, false)); +        }          setExitCondition(mController.getExitCondition());          refreshExitConditionText();          mSessionZen = getSelectedZen(-1); diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java new file mode 100644 index 000000000000..3fdb3d299632 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui; + +import android.test.AndroidTestCase; + +/** + * Base class that does System UI specific setup. + */ +public class SysuiTestCase extends AndroidTestCase { +    @Override +    protected void setUp() throws Exception { +        super.setUp(); +        // Mockito stuff. +        System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath()); +        Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); +    } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java new file mode 100644 index 000000000000..e8a80d9f587d --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.policy; + +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; + +import android.app.Notification; +import android.os.*; +import android.service.notification.StatusBarNotification; +import com.android.systemui.SwipeHelper; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.phone.PhoneStatusBar; + +import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +/** + * Test the Heads Up Notification. + * + * Specifically the policy that a notificaiton must remain visibile for a minimum period of time. + */ +public class HeadsUpNotificationTest extends SysuiTestCase { +    private static final String TAG = "HeadsUpNotificationTest"; + +    private static int TOUCH_SENSITIVITY = 100; +    private static int NOTIFICATION_DECAY = 10000; +    private static int MINIMUM_DISPLAY_TIME = 3000; +    private static int SNOOZE_TIME = 60000; +    private static long TOO_SOON = 1000L;  // less than MINIMUM_DISPLAY_TIME +    private static long LATER = 5000L;  // more than MINIMUM_DISPLAY_TIME +    private static long REMAINING_VISIBILITY = MINIMUM_DISPLAY_TIME - TOO_SOON; + +    protected HeadsUpNotificationView mHeadsUp; + +    @Mock protected PhoneStatusBar mMockStatusBar; +    @Mock private HeadsUpNotificationView.Clock mClock; +    @Mock private SwipeHelper mMockSwipeHelper; +    @Mock private HeadsUpNotificationView.EdgeSwipeHelper mMockEdgeSwipeHelper; + +    @Override +    protected void setUp() throws Exception { +        super.setUp(); + +        MockitoAnnotations.initMocks(this); + +        mHeadsUp = new HeadsUpNotificationView(mContext, +                mClock, mMockSwipeHelper, mMockEdgeSwipeHelper, +                NOTIFICATION_DECAY, MINIMUM_DISPLAY_TIME, TOUCH_SENSITIVITY, SNOOZE_TIME); +        mHeadsUp.setBar(mMockStatusBar); +    } + +    private NotificationData.Entry makeNotification(String key) { +        StatusBarNotification sbn = mock(StatusBarNotification.class); +        when(sbn.getKey()).thenReturn(key); +        return new NotificationData.Entry(sbn, null); +    } + +    public void testPostAndDecay() { +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpOpen(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar).scheduleHeadsUpDecay(decayArg.capture()); +        // New notification gets a full decay time. +        assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); +    } + +    public void testPostAndDeleteTooSoon() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        mHeadsUp.removeNotification(a.key); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar).scheduleHeadsUpDecay(decayArg.capture()); +        // Leave the window up for the balance of the minumum time. +        assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); +    } + +    public void testPostAndDeleteLater() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(LATER); +        mHeadsUp.removeNotification(a.key); +        // Delete closes immediately if the minimum time window is satisfied. +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); +    } + +    // This is a bad test.  It should not care that there is a call to scheduleHeadsUpClose(), +    // but it happens that there will be one, so it is important that it happen before the +    // call to scheduleHeadsUpOpen(), so that the final state is open. +    // Maybe mMockStatusBar should instead be a fake that tracks the open/closed state. +    public void testPostAndReplaceTooSoon() { +        InOrder callOrder = inOrder(mMockStatusBar); +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        NotificationData.Entry b = makeNotification("b"); +        mHeadsUp.showNotification(b); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); +        // New notification gets a full decay time. +        assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); + +        // Make sure close was called before open, so that the heads up stays open. +        callOrder.verify(mMockStatusBar).scheduleHeadsUpClose(); +        callOrder.verify(mMockStatusBar).scheduleHeadsUpOpen(); +    } + +    public void testPostAndUpdateAlertAgain() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        mHeadsUp.updateNotification(a, true); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); +        // Alert again gets a full decay time. +        assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); +    } + +    public void testPostAndUpdateAlertAgainFastFail() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        NotificationData.Entry a_prime = makeNotification("a"); +        mHeadsUp.updateNotification(a_prime, true); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); +        // Alert again gets a full decay time. +        assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); +    } + +    public void testPostAndUpdateNoAlertAgain() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        mHeadsUp.updateNotification(a, false); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); +    } + +    public void testPostAndUpdateNoAlertAgainFastFail() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        NotificationData.Entry a_prime = makeNotification("a"); +        mHeadsUp.updateNotification(a_prime, false); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); +    } + +    public void testPostAndUpdateLowPriorityTooSoon() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        mHeadsUp.release(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); +        // Down grade on update leaves the window up for the balance of the minumum time. +        assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); +    } + +    public void testPostAndUpdateLowPriorityTooSoonFastFail() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); +        NotificationData.Entry a_prime = makeNotification("a"); +        mHeadsUp.updateNotification(a_prime, false); +        mHeadsUp.release(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); +        ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); +        // Down grade on update leaves the window up for the balance of the minumum time. +        assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); +    } + +    public void testPostAndUpdateLowPriorityLater() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(LATER); +        mHeadsUp.release(); +        // Down grade on update closes immediately if the minimum time window is satisfied. +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); +    } + +    public void testPostAndUpdateLowPriorityLaterFastFail() { +        when(mClock.currentTimeMillis()).thenReturn(0L); +        NotificationData.Entry a = makeNotification("a"); +        mHeadsUp.showNotification(a); +        reset(mMockStatusBar); + +        when(mClock.currentTimeMillis()).thenReturn(LATER); +        NotificationData.Entry a_prime = makeNotification("a"); +        mHeadsUp.updateNotification(a_prime, false); +        mHeadsUp.release(); +        // Down grade on update closes immediately if the minimum time window is satisfied. +        Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); +        Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); +    } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 260dea012583..5d884076a1f3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -29,11 +29,11 @@ import android.telephony.SignalStrength;  import android.telephony.SubscriptionInfo;  import android.telephony.SubscriptionManager;  import android.telephony.TelephonyManager; -import android.test.AndroidTestCase;  import android.util.Log;  import com.android.internal.telephony.IccCardConstants;  import com.android.internal.telephony.cdma.EriInfo; +import com.android.systemui.SysuiTestCase;  import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;  import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;  import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster; @@ -46,7 +46,7 @@ import java.io.StringWriter;  import java.util.ArrayList;  import java.util.List; -public class NetworkControllerBaseTest extends AndroidTestCase { +public class NetworkControllerBaseTest extends SysuiTestCase {      private static final String TAG = "NetworkControllerBaseTest";      protected static final int DEFAULT_LEVEL = 2;      protected static final int DEFAULT_SIGNAL_STRENGTH = @@ -76,9 +76,6 @@ public class NetworkControllerBaseTest extends AndroidTestCase {      @Override      protected void setUp() throws Exception {          super.setUp(); -        // Mockito stuff. -        System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath()); -        Thread.currentThread().setContextClassLoader(getClass().getClassLoader());          mMockWm = mock(WifiManager.class);          mMockTm = mock(TelephonyManager.class); diff --git a/policy/Android.mk b/policy/Android.mk deleted file mode 100644 index 47d8fb875876..000000000000 --- a/policy/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -# the library -# ============================================================ -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-java-files-under, src) -             -LOCAL_MODULE := android.policy - -include $(BUILD_JAVA_LIBRARY) - -# additionally, build unit tests in a separate .apk -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/policy/src/com/android/internal/policy/impl/Policy.java b/policy/src/com/android/internal/policy/impl/Policy.java deleted file mode 100644 index 42bfc5fb2474..000000000000 --- a/policy/src/com/android/internal/policy/impl/Policy.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.policy.impl; - -import android.content.Context; -import android.util.Log; -import android.view.FallbackEventHandler; -import android.view.LayoutInflater; -import android.view.Window; -import android.view.WindowManagerPolicy; - -import com.android.internal.policy.IPolicy; - -/** - * {@hide} - */ - -// Simple implementation of the policy interface that spawns the right -// set of objects -public class Policy implements IPolicy { -    private static final String TAG = "PhonePolicy"; - -    private static final String[] preload_classes = { -        "com.android.internal.policy.impl.PhoneLayoutInflater", -        "com.android.internal.policy.impl.PhoneWindow", -        "com.android.internal.policy.impl.PhoneWindow$1", -        "com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback", -        "com.android.internal.policy.impl.PhoneWindow$DecorView", -        "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState", -        "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState", -    }; - -    static { -        // For performance reasons, preload some policy specific classes when -        // the policy gets loaded. -        for (String s : preload_classes) { -            try { -                Class.forName(s); -            } catch (ClassNotFoundException ex) { -                Log.e(TAG, "Could not preload class for phone policy: " + s); -            } -        } -    } - -    public Window makeNewWindow(Context context) { -        return new PhoneWindow(context); -    } - -    public LayoutInflater makeNewLayoutInflater(Context context) { -        return new PhoneLayoutInflater(context); -    } - -    public WindowManagerPolicy makeNewWindowManager() { -        return new PhoneWindowManager(); -    } - -    public FallbackEventHandler makeNewFallbackEventHandler(Context context) { -        return new PhoneFallbackEventHandler(context); -    } -} diff --git a/policy/src/com/android/internal/policy/impl/package.html b/policy/src/com/android/internal/policy/impl/package.html deleted file mode 100644 index c9f96a66ab3b..000000000000 --- a/policy/src/com/android/internal/policy/impl/package.html +++ /dev/null @@ -1,5 +0,0 @@ -<body> - -{@hide} - -</body> diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java index e979a1bed7a7..4af66887dba6 100644 --- a/rs/java/android/renderscript/Allocation.java +++ b/rs/java/android/renderscript/Allocation.java @@ -58,15 +58,13 @@ public class Allocation extends BaseObj {      Allocation mAdaptedAllocation;      int mSize; -    boolean mConstrainedLOD; -    boolean mConstrainedFace; -    boolean mConstrainedY; -    boolean mConstrainedZ;      boolean mReadAllowed = true;      boolean mWriteAllowed = true; +    int mSelectedX;      int mSelectedY;      int mSelectedZ;      int mSelectedLOD; +    int mSelectedArray[];      Type.CubemapFace mSelectedFace = Type.CubemapFace.POSITIVE_X;      int mCurrentDimX; diff --git a/rs/java/android/renderscript/AllocationAdapter.java b/rs/java/android/renderscript/AllocationAdapter.java index 3522a52fba8a..9e28f7c5d097 100644 --- a/rs/java/android/renderscript/AllocationAdapter.java +++ b/rs/java/android/renderscript/AllocationAdapter.java @@ -21,76 +21,20 @@ package android.renderscript;   *   **/  public class AllocationAdapter extends Allocation { -    AllocationAdapter(long id, RenderScript rs, Allocation alloc) { +    Type mWindow; + +    AllocationAdapter(long id, RenderScript rs, Allocation alloc, Type t) {          super(id, rs, alloc.mType, alloc.mUsage);          mAdaptedAllocation = alloc; +        mWindow = t;      } +    /*      long getID(RenderScript rs) {          throw new RSInvalidStateException(              "This operation is not supported with adapters at this time.");      } - -    /** -     * @hide -     */ -    public void subData(int xoff, FieldPacker fp) { -        super.setFromFieldPacker(xoff, fp); -    } -    /** -     * @hide -     */ -    public void subElementData(int xoff, int component_number, FieldPacker fp) { -        super.setFromFieldPacker(xoff, component_number, fp); -    } -    /** -     * @hide -     */ -    public void subData1D(int off, int count, int[] d) { -        super.copy1DRangeFrom(off, count, d); -    } -    /** -     * @hide -     */ -    public void subData1D(int off, int count, short[] d) { -        super.copy1DRangeFrom(off, count, d); -    } -    /** -     * @hide -     */ -    public void subData1D(int off, int count, byte[] d) { -        super.copy1DRangeFrom(off, count, d); -    } -    /** -     * @hide -     */ -    public void subData1D(int off, int count, float[] d) { -        super.copy1DRangeFrom(off, count, d); -    } -    /** -     * @hide -     */ -    public void subData2D(int xoff, int yoff, int w, int h, int[] d) { -        super.copy2DRangeFrom(xoff, yoff, w, h, d); -    } -    /** -     * @hide -     */ -    public void subData2D(int xoff, int yoff, int w, int h, float[] d) { -        super.copy2DRangeFrom(xoff, yoff, w, h, d); -    } -    /** -     * @hide -     */ -    public void readData(int[] d) { -        super.copyTo(d); -    } -    /** -     * @hide -     */ -    public void readData(float[] d) { -        super.copyTo(d); -    } +    */      void initLOD(int lod) {          if (lod < 0) { @@ -125,6 +69,26 @@ public class AllocationAdapter extends Allocation {          mSelectedZ = 0;      } +    private void updateOffsets() { +        int a1 = 0, a2 = 0, a3 = 0, a4 = 0; + +        if (mSelectedArray.length > 0) { +            a1 = mSelectedArray[0]; +        } +        if (mSelectedArray.length > 1) { +            a2 = mSelectedArray[2]; +        } +        if (mSelectedArray.length > 2) { +            a3 = mSelectedArray[2]; +        } +        if (mSelectedArray.length > 3) { +            a4 = mSelectedArray[3]; +        } +        mRS.nAllocationAdapterOffset(getID(mRS), mSelectedX, mSelectedY, mSelectedZ, +                                     mSelectedLOD, mSelectedFace.mID, a1, a2, a3, a4); + +    } +      /**       * Set the active LOD.  The LOD must be within the range for the       * type being adapted.  The base allocation must have mipmaps. @@ -138,11 +102,13 @@ public class AllocationAdapter extends Allocation {          if (!mAdaptedAllocation.getType().hasMipmaps()) {              throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps.");          } -        if (!mConstrainedLOD) { +        if (mWindow.hasMipmaps()) {              throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");          }          initLOD(lod); +        mSelectedLOD = lod; +        updateOffsets();      }      /** @@ -155,14 +121,38 @@ public class AllocationAdapter extends Allocation {          if (!mAdaptedAllocation.getType().hasFaces()) {              throw new RSInvalidStateException("Cannot set Face when the allocation type does not include faces.");          } -        if (!mConstrainedFace) { -            throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps."); +        if (mWindow.hasFaces()) { +            throw new RSInvalidStateException("Cannot set face when the adapter includes faces.");          }          if (cf == null) {              throw new RSIllegalArgumentException("Cannot set null face.");          }          mSelectedFace = cf; +        updateOffsets(); +    } + + +    /** +     * @hide +     * Set the active X.  The x value must be within the range for +     * the allocation being adapted. +     * +     * @param x The x to make active. +     */ +    public void setX(int x) { +        if (mAdaptedAllocation.getType().getX() <= x) { +            throw new RSInvalidStateException("Cannot set X greater than dimension of allocation."); +        } +        if (mWindow.getX() == mAdaptedAllocation.getType().getX()) { +            throw new RSInvalidStateException("Cannot set X when the adapter includes X."); +        } +        if ((mWindow.getX() + x) >= mAdaptedAllocation.getType().getX()) { +            throw new RSInvalidStateException("Cannot set (X + window) which would be larger than dimension of allocation."); +        } + +        mSelectedX = x; +        updateOffsets();      }      /** @@ -179,11 +169,15 @@ public class AllocationAdapter extends Allocation {          if (mAdaptedAllocation.getType().getY() <= y) {              throw new RSInvalidStateException("Cannot set Y greater than dimension of allocation.");          } -        if (!mConstrainedY) { +        if (mWindow.getY() == mAdaptedAllocation.getType().getY()) {              throw new RSInvalidStateException("Cannot set Y when the adapter includes Y.");          } +        if ((mWindow.getY() + y) >= mAdaptedAllocation.getType().getY()) { +            throw new RSInvalidStateException("Cannot set (Y + window) which would be larger than dimension of allocation."); +        }          mSelectedY = y; +        updateOffsets();      }      /** @@ -200,35 +194,112 @@ public class AllocationAdapter extends Allocation {          if (mAdaptedAllocation.getType().getZ() <= z) {              throw new RSInvalidStateException("Cannot set Z greater than dimension of allocation.");          } -        if (!mConstrainedZ) { +        if (mWindow.getZ() == mAdaptedAllocation.getType().getZ()) {              throw new RSInvalidStateException("Cannot set Z when the adapter includes Z.");          } +        if ((mWindow.getZ() + z) >= mAdaptedAllocation.getType().getZ()) { +            throw new RSInvalidStateException("Cannot set (Z + window) which would be larger than dimension of allocation."); +        }          mSelectedZ = z; +        updateOffsets(); +    } + +    /** +     * @hide +     */ +    public void setArray(int arrayNum, int arrayVal) { +        if (mAdaptedAllocation.getType().getArray(arrayNum) == 0) { +            throw new RSInvalidStateException("Cannot set arrayNum when the allocation type does not include arrayNum dim."); +        } +        if (mAdaptedAllocation.getType().getArray(arrayNum) <= arrayVal) { +            throw new RSInvalidStateException("Cannot set arrayNum greater than dimension of allocation."); +        } +        if (mWindow.getArray(arrayNum) == mAdaptedAllocation.getType().getArray(arrayNum)) { +            throw new RSInvalidStateException("Cannot set arrayNum when the adapter includes arrayNum."); +        } +        if ((mWindow.getArray(arrayNum) + arrayVal) >= mAdaptedAllocation.getType().getArray(arrayNum)) { +            throw new RSInvalidStateException("Cannot set (arrayNum + window) which would be larger than dimension of allocation."); +        } + +        mSelectedArray[arrayNum] = arrayVal; +        updateOffsets();      }      static public AllocationAdapter create1D(RenderScript rs, Allocation a) {          rs.validate(); -        AllocationAdapter aa = new AllocationAdapter(0, rs, a); -        aa.mConstrainedLOD = true; -        aa.mConstrainedFace = true; -        aa.mConstrainedY = true; -        aa.mConstrainedZ = true; -        aa.initLOD(0); -        return aa; +        Type t = Type.createX(rs, a.getElement(), a.getType().getX()); +        return createTyped(rs, a, t);      } +      static public AllocationAdapter create2D(RenderScript rs, Allocation a) {          rs.validate(); -        AllocationAdapter aa = new AllocationAdapter(0, rs, a); -        aa.mConstrainedLOD = true; -        aa.mConstrainedFace = true; -        aa.mConstrainedY = false; -        aa.mConstrainedZ = true; -        aa.initLOD(0); -        return aa; +        Type t = Type.createXY(rs, a.getElement(), a.getType().getX(), a.getType().getY()); +        return createTyped(rs, a, t);      } +    /** +     * @hide +     * +     * Create an arbitrary window into the base allocation +     * The type describes the shape of the window. +     * +     * Any dimensions present in the type must be equal or smaller +     * to the dimensions in the source allocation.  A dimension +     * present in the allocation that is not present in the type +     * will be constrained away with the selectors +     * +     * If a dimension is present in the type and allcation one of +     * two things will happen +     * +     * If the type is smaller than the allocation a window will be +     * created, the selected value in the adapter for that dimension +     * will act as the base address and the type will describe the +     * size of the view starting at that point. +     * +     * If the type and allocation dimension are of the same size +     * then setting the selector for the dimension will be an error. +     */ +    static public AllocationAdapter createTyped(RenderScript rs, Allocation a, Type t) { +        rs.validate(); + +        if (a.mAdaptedAllocation != null) { +            throw new RSInvalidStateException("Adapters cannot be nested."); +        } + +        if (!a.getType().getElement().equals(t.getElement())) { +            throw new RSInvalidStateException("Element must match Allocation type."); +        } + +        if (t.hasFaces() || t.hasMipmaps()) { +            throw new RSInvalidStateException("Adapters do not support window types with Mipmaps or Faces."); +        } + +        Type at = a.getType(); +        if ((t.getX() > at.getX()) || +            (t.getY() > at.getY()) || +            (t.getZ() > at.getZ()) || +            (t.getArrayCount() > at.getArrayCount())) { + +            throw new RSInvalidStateException("Type cannot have dimension larger than the source allocation."); +        } + +        if (t.getArrayCount() > 0) { +            for (int i = 0; i < t.getArray(i); i++) { +                if (t.getArray(i) > at.getArray(i)) { +                    throw new RSInvalidStateException("Type cannot have dimension larger than the source allocation."); +                } +            } +        } + +        // Create the object +        long id = rs.nAllocationAdapterCreate(a.getID(rs), t.getID(rs)); +        if (id == 0) { +            throw new RSRuntimeException("AllocationAdapter creation failed."); +        } +        return new AllocationAdapter(id, rs, a, t); +    }      /**       * Override the Allocation resize.  Resizing adapters is not diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java index 94aa8578d233..5e150e98572b 100644 --- a/rs/java/android/renderscript/RenderScript.java +++ b/rs/java/android/renderscript/RenderScript.java @@ -591,6 +591,20 @@ public class RenderScript {          rsnAllocationResize1D(mContext, id, dimX);      } +    native long  rsnAllocationAdapterCreate(long con, long allocId, long typeId); +    synchronized long nAllocationAdapterCreate(long allocId, long typeId) { +        validate(); +        return rsnAllocationAdapterCreate(mContext, allocId, typeId); +    } + +    native void  rsnAllocationAdapterOffset(long con, long id, int x, int y, int z, +                                            int mip, int face, int a1, int a2, int a3, int a4); +    synchronized void nAllocationAdapterOffset(long id, int x, int y, int z, +                                               int mip, int face, int a1, int a2, int a3, int a4) { +        validate(); +        rsnAllocationAdapterOffset(mContext, id, x, y, z, mip, face, a1, a2, a3, a4); +    } +      native long rsnFileA3DCreateFromAssetStream(long con, long assetStream);      synchronized long nFileA3DCreateFromAssetStream(long assetStream) {          validate(); diff --git a/rs/java/android/renderscript/Type.java b/rs/java/android/renderscript/Type.java index 98aeaa95d3bc..a58e42cd9712 100644 --- a/rs/java/android/renderscript/Type.java +++ b/rs/java/android/renderscript/Type.java @@ -52,6 +52,9 @@ public class Type extends BaseObj {      int mDimYuv;      int mElementCount;      Element mElement; +    int mArrays[]; + +    static final int mMaxArrays = 4;      public enum CubemapFace {          POSITIVE_X (0), @@ -146,6 +149,30 @@ public class Type extends BaseObj {          return mElementCount;      } +    /** +     * @hide +     */ +    public int getArray(int dim) { +        if ((dim < 0) || (dim >= mMaxArrays)) { +            throw new RSIllegalArgumentException("Array dimension out of range."); +        } + +        if (mArrays == null || dim >= mArrays.length) { +            // Dimension in range but no array for that dimension allocated +            return 0; +        } + +        return mArrays[dim]; +    } + +    /** +     * @hide +     */ +    public int getArrayCount() { +        if (mArrays != null) return mArrays.length; +        return 0; +    } +      void calcElementCount() {          boolean hasLod = hasMipmaps();          int x = getX(); @@ -180,6 +207,13 @@ public class Type extends BaseObj {              count += x * y * z * faces;          } + +        if (mArrays != null) { +            for (int ct = 0; ct < mArrays.length; ct++) { +                count *= mArrays[ct]; +            } +        } +          mElementCount = count;      } @@ -296,6 +330,7 @@ public class Type extends BaseObj {          boolean mDimMipmaps;          boolean mDimFaces;          int mYuv; +        int[] mArray = new int[mMaxArrays];          Element mElement; @@ -341,6 +376,22 @@ public class Type extends BaseObj {              return this;          } +        /** +         * @hide +         * +         * @param dim +         * @param value +         * +         * @return Builder +         */ +        public Builder setArray(int dim, int value) { +            if(dim < 0 || dim >= mMaxArrays) { +                throw new RSIllegalArgumentException("Array dimension out of range."); +            } +            mArray[dim] = value; +            return this; +        } +          public Builder setMipmaps(boolean value) {              mDimMipmaps = value;              return this; @@ -405,6 +456,16 @@ public class Type extends BaseObj {                  }              } +            int[] arrays = null; +            for (int ct = mMaxArrays - 1; ct >= 0; ct--) { +                if (mArray[ct] != 0 && arrays == null) { +                    arrays = new int[ct]; +                } +                if ((mArray[ct] == 0) && (arrays != null)) { +                    throw new RSInvalidStateException("Array dimensions must be contigous from 0."); +                } +            } +              long id = mRS.nTypeCreate(mElement.getID(mRS),                                       mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);              Type t = new Type(id, mRS); @@ -415,6 +476,7 @@ public class Type extends BaseObj {              t.mDimMipmaps = mDimMipmaps;              t.mDimFaces = mDimFaces;              t.mDimYuv = mYuv; +            t.mArrays = arrays;              t.calcElementCount();              return t; diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index b25dd4119111..198cabe1b050 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -1047,6 +1047,37 @@ nAllocationResize1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint di      rsAllocationResize1D((RsContext)con, (RsAllocation)alloc, dimX);  } + +static jlong +nAllocationAdapterCreate(JNIEnv *_env, jobject _this, jlong con, jlong basealloc, jlong type) +{ +    if (kLogApi) { +        ALOGD("nAllocationAdapterCreate, con(%p), base(%p), type(%p)", +              (RsContext)con, (RsAllocation)basealloc, (RsElement)type); +    } +    return (jlong)(uintptr_t) rsAllocationAdapterCreate((RsContext)con, (RsType)type, +                                                        (RsAllocation)basealloc); + +} + +static void +nAllocationAdapterOffset(JNIEnv *_env, jobject _this, jlong con, jlong alloc, +                        jint x, jint y, jint z, jint face, jint lod, +                        jint a1, jint a2, jint a3, jint a4) +{ +    uint32_t params[] = { +        (uint32_t)x, (uint32_t)y, (uint32_t)z, (uint32_t)face, +        (uint32_t)lod, (uint32_t)a1, (uint32_t)a2, (uint32_t)a3, (uint32_t)a4 +    }; +    if (kLogApi) { +        ALOGD("nAllocationAdapterOffset, con(%p), alloc(%p), x(%i), y(%i), z(%i), face(%i), lod(%i), arrays(%i %i %i %i)", +              (RsContext)con, (RsAllocation)alloc, x, y, z, face, lod, a1, a2, a3, a4); +    } +    rsAllocationAdapterOffset((RsContext)con, (RsAllocation)alloc, +                              params, sizeof(params)); +} + +  // -----------------------------------  static jlong @@ -2028,6 +2059,9 @@ static JNINativeMethod methods[] = {  {"rsnAllocationResize1D",            "(JJI)V",                                (void*)nAllocationResize1D },  {"rsnAllocationGenerateMipmaps",     "(JJ)V",                                 (void*)nAllocationGenerateMipmaps }, +{"rsnAllocationAdapterCreate",       "(JJJ)J",                                (void*)nAllocationAdapterCreate }, +{"rsnAllocationAdapterOffset",       "(JJIIIIIIIII)V",                        (void*)nAllocationAdapterOffset }, +  {"rsnScriptBindAllocation",          "(JJJI)V",                               (void*)nScriptBindAllocation },  {"rsnScriptSetTimeZone",             "(JJ[B)V",                               (void*)nScriptSetTimeZone },  {"rsnScriptInvoke",                  "(JJI)V",                                (void*)nScriptInvoke }, diff --git a/services/core/Android.mk b/services/core/Android.mk index 5c4520170fd8..1a0fa34344d8 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -9,6 +9,6 @@ LOCAL_SRC_FILES += \      java/com/android/server/EventLogTags.logtags \      java/com/android/server/am/EventLogTags.logtags -LOCAL_JAVA_LIBRARIES := android.policy telephony-common +LOCAL_JAVA_LIBRARIES := telephony-common  include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 944f1c0bea23..551a5dc1dcce 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -832,6 +832,19 @@ public class ConnectivityService extends IConnectivityManager.Stub          }      }; +    private Network[] getVpnUnderlyingNetworks(int uid) { +        if (!mLockdownEnabled) { +            int user = UserHandle.getUserId(uid); +            synchronized (mVpns) { +                Vpn vpn = mVpns.get(user); +                if (vpn != null && vpn.appliesToUid(uid)) { +                    return vpn.getUnderlyingNetworks(); +                } +            } +        } +        return null; +    } +      private NetworkState getUnfilteredActiveNetworkState(int uid) {          NetworkInfo info = null;          LinkProperties lp = null; @@ -841,25 +854,17 @@ public class ConnectivityService extends IConnectivityManager.Stub          NetworkAgentInfo nai = mNetworkForRequestId.get(mDefaultRequest.requestId); -        if (!mLockdownEnabled) { -            int user = UserHandle.getUserId(uid); -            synchronized (mVpns) { -                Vpn vpn = mVpns.get(user); -                if (vpn != null && vpn.appliesToUid(uid)) { -                    // getUnderlyingNetworks() returns: -                    // null => the VPN didn't specify anything, so we use the default. -                    // empty array => the VPN explicitly said "no default network". -                    // non-empty array => the VPN specified one or more default networks; we use the -                    //                    first one. -                    Network[] networks = vpn.getUnderlyingNetworks(); -                    if (networks != null) { -                        if (networks.length > 0) { -                            nai = getNetworkAgentInfoForNetwork(networks[0]); -                        } else { -                            nai = null; -                        } -                    } -                } +        final Network[] networks = getVpnUnderlyingNetworks(uid); +        if (networks != null) { +            // getUnderlyingNetworks() returns: +            // null => there was no VPN, or the VPN didn't specify anything, so we use the default. +            // empty array => the VPN explicitly said "no default network". +            // non-empty array => the VPN specified one or more default networks; we use the +            //                    first one. +            if (networks.length > 0) { +                nai = getNetworkAgentInfoForNetwork(networks[0]); +            } else { +                nai = null;              }          } @@ -990,6 +995,15 @@ public class ConnectivityService extends IConnectivityManager.Stub      public NetworkInfo getNetworkInfo(int networkType) {          enforceAccessPermission();          final int uid = Binder.getCallingUid(); +        if (getVpnUnderlyingNetworks(uid) != null) { +            // A VPN is active, so we may need to return one of its underlying networks. This +            // information is not available in LegacyTypeTracker, so we have to get it from +            // getUnfilteredActiveNetworkState. +            NetworkState state = getUnfilteredActiveNetworkState(uid); +            if (state.networkInfo != null && state.networkInfo.getType() == networkType) { +                return getFilteredNetworkInfo(state.networkInfo, state.linkProperties, uid); +            } +        }          NetworkState state = getFilteredNetworkState(networkType, uid);          return state.networkInfo;      } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7a493c6d0e3b..1eec141350d5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3731,6 +3731,10 @@ public final class ActivityManagerService extends ActivityManagerNative              if (r == null) {                  return;              } +            if (r.task != null && r.task.mResizeable) { +                // Fixed screen orientation isn't supported with resizeable activities. +                return; +            }              final long origId = Binder.clearCallingIdentity();              mWindowManager.setAppOrientation(r.appToken, requestedOrientation);              Configuration config = mWindowManager.updateOrientationFromAppTokens( @@ -6247,7 +6251,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  "setProcessForeground()");          synchronized(this) {              boolean changed = false; -             +              synchronized (mPidsSelfLocked) {                  ProcessRecord pr = mPidsSelfLocked.get(pid);                  if (pr == null && isForeground) { @@ -6283,7 +6287,7 @@ public final class ActivityManagerService extends ActivityManagerNative                      }                  }              } -             +              if (changed) {                  updateOomAdjLocked();              } @@ -6378,7 +6382,7 @@ public final class ActivityManagerService extends ActivityManagerNative       * permission is automatically denied.  (Internally a null permission       * string is used when calling {@link #checkComponentPermission} in cases       * when only uid-based security is needed.) -     *  +     *       * This can be called with or without the global lock held.       */      @Override @@ -6655,12 +6659,12 @@ public final class ActivityManagerService extends ActivityManagerNative              if (DEBUG_URI_PERMISSION) Slog.v(TAG,                      "Checking grant " + targetPkg + " permission to " + grantUri);          } -         +          final IPackageManager pm = AppGlobals.getPackageManager();          // If this is not a content: uri, we can't do anything with it.          if (!ContentResolver.SCHEME_CONTENT.equals(grantUri.uri.getScheme())) { -            if (DEBUG_URI_PERMISSION) Slog.v(TAG,  +            if (DEBUG_URI_PERMISSION) Slog.v(TAG,                      "Can't grant URI permission for non-content URI: " + grantUri);              return -1;          } @@ -6788,7 +6792,7 @@ public final class ActivityManagerService extends ActivityManagerNative          // to the uri, and the target doesn't.  Let's now give this to          // the target. -        if (DEBUG_URI_PERMISSION) Slog.v(TAG,  +        if (DEBUG_URI_PERMISSION) Slog.v(TAG,                  "Granting " + targetPkg + "/" + targetUid + " permission to " + grantUri);          final String authority = grantUri.uri.getAuthority(); @@ -6990,7 +6994,7 @@ public final class ActivityManagerService extends ActivityManagerNative              final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(                      perm.targetUid);              if (perms != null) { -                if (DEBUG_URI_PERMISSION) Slog.v(TAG,  +                if (DEBUG_URI_PERMISSION) Slog.v(TAG,                          "Removing " + perm.targetUid + " permission to " + perm.uri);                  perms.remove(perm.uri); @@ -9120,7 +9124,7 @@ public final class ActivityManagerService extends ActivityManagerNative              }          }      } -     +      public final void publishContentProviders(IApplicationThread caller,              List<ContentProviderHolder> providers) {          if (providers == null) { @@ -9703,7 +9707,7 @@ public final class ActivityManagerService extends ActivityManagerNative              throw new SecurityException("Requires permission "                      + android.Manifest.permission.STOP_APP_SWITCHES);          } -         +          synchronized(this) {              mAppSwitchesAllowedTime = SystemClock.uptimeMillis()                      + APP_SWITCH_DELAY_TIME; @@ -9713,14 +9717,14 @@ public final class ActivityManagerService extends ActivityManagerNative              mHandler.sendMessageDelayed(msg, APP_SWITCH_DELAY_TIME);          }      } -     +      public void resumeAppSwitches() {          if (checkCallingPermission(android.Manifest.permission.STOP_APP_SWITCHES)                  != PackageManager.PERMISSION_GRANTED) {              throw new SecurityException("Requires permission "                      + android.Manifest.permission.STOP_APP_SWITCHES);          } -         +          synchronized(this) {              // Note that we don't execute any pending app switches... we will              // let those wait until either the timeout, or the next start @@ -9728,7 +9732,7 @@ public final class ActivityManagerService extends ActivityManagerNative              mAppSwitchesAllowedTime = 0;          }      } -     +      boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,              int callingPid, int callingUid, String name) {          if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) { @@ -9756,7 +9760,7 @@ public final class ActivityManagerService extends ActivityManagerNative          Slog.w(TAG, name + " request from " + sourceUid + " stopped");          return false;      } -     +      public void setDebugApp(String packageName, boolean waitForDebugger,              boolean persistent) {          enforceCallingPermission(android.Manifest.permission.SET_DEBUG_APP, @@ -10819,7 +10823,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  }              }          } -         +          synchronized(this) {              if (procsToKill != null) {                  for (int i=procsToKill.size()-1; i>=0; i--) { @@ -10828,20 +10832,20 @@ public final class ActivityManagerService extends ActivityManagerNative                      removeProcessLocked(proc, true, false, "system update done");                  }              } -             +              // Now that we have cleaned up any update processes, we              // are ready to start launching real processes and know that              // we won't trample on them any more.              mProcessesReady = true;          } -         +          Slog.i(TAG, "System now ready");          EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,              SystemClock.uptimeMillis());          synchronized(this) {              // Make sure we have no pre-ready processes sitting around. -             +              if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {                  ResolveInfo ri = mContext.getPackageManager()                          .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), @@ -10925,7 +10929,7 @@ public final class ActivityManagerService extends ActivityManagerNative              } catch (RemoteException e) {              } -            if (!Build.isFingerprintConsistent()) { +            if (!Build.isBuildConsistent()) {                  Slog.e(TAG, "Build fingerprint is not consistent, warning user");                  mHandler.obtainMessage(SHOW_FINGERPRINT_ERROR_MSG).sendToTarget();              } @@ -10981,12 +10985,12 @@ public final class ActivityManagerService extends ActivityManagerNative          startAppProblemLocked(app);          app.stopFreezingAllLocked();      } -     +      /**       * Generate a process error record, suitable for attachment to a ProcessRecord. -     *  +     *       * @param app The ProcessRecord in which the error occurred. -     * @param condition Crashing, Application Not Responding, etc.  Values are defined in  +     * @param condition Crashing, Application Not Responding, etc.  Values are defined in       *                      ActivityManager.AppErrorStateInfo       * @param activity The activity associated with the crash, if known.       * @param shortMsg Short message describing the crash. @@ -10995,7 +10999,7 @@ public final class ActivityManagerService extends ActivityManagerNative       *       * @return Returns a fully-formed AppErrorStateInfo record.       */ -    private ActivityManager.ProcessErrorStateInfo generateProcessError(ProcessRecord app,  +    private ActivityManager.ProcessErrorStateInfo generateProcessError(ProcessRecord app,              int condition, String activity, String shortMsg, String longMsg, String stackTrace) {          ActivityManager.ProcessErrorStateInfo report = new ActivityManager.ProcessErrorStateInfo(); @@ -12407,12 +12411,12 @@ public final class ActivityManagerService extends ActivityManagerNative                  }              }          } -         +          if (mForegroundProcesses.size() > 0) {              synchronized (mPidsSelfLocked) {                  boolean printed = false;                  for (int i=0; i<mForegroundProcesses.size(); i++) { -                    ProcessRecord r = mPidsSelfLocked.get(  +                    ProcessRecord r = mPidsSelfLocked.get(                              mForegroundProcesses.valueAt(i).pid);                      if (dumpPackage != null && (r == null                              || !r.pkgList.containsKey(dumpPackage))) { @@ -12430,7 +12434,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  }              }          } -         +          if (mPersistentStartingProcesses.size() > 0) {              if (needSep) pw.println();              needSep = true; @@ -12448,7 +12452,7 @@ public final class ActivityManagerService extends ActivityManagerNative              dumpProcessList(pw, this, mRemovedProcesses, "    ",                      "Removed Norm", "Removed PERS", dumpPackage);          } -         +          if (mProcessesOnHold.size() > 0) {              if (needSep) pw.println();              needSep = true; @@ -12459,7 +12463,7 @@ public final class ActivityManagerService extends ActivityManagerNative          }          needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll, dumpPackage); -         +          if (mProcessCrashTimes.getMap().size() > 0) {              boolean printed = false;              long now = SystemClock.uptimeMillis(); @@ -12831,7 +12835,7 @@ public final class ActivityManagerService extends ActivityManagerNative          ArrayList<String> strings;          ArrayList<Integer> objects;          boolean all; -         +          ItemMatcher() {              all = true;          } @@ -12916,7 +12920,7 @@ public final class ActivityManagerService extends ActivityManagerNative      protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,              int opti, boolean dumpAll) {          ArrayList<ActivityRecord> activities; -         +          synchronized (this) {              activities = mStackSupervisor.getDumpActivitiesLocked(name);          } @@ -13039,7 +13043,7 @@ public final class ActivityManagerService extends ActivityManagerNative          }          needSep = true; -         +          if (!onlyHistory && mStickyBroadcasts != null && dumpPackage == null) {              for (int user=0; user<mStickyBroadcasts.size(); user++) {                  if (needSep) { @@ -13074,7 +13078,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  }              }          } -         +          if (!onlyHistory && dumpAll) {              pw.println();              for (BroadcastQueue queue : mBroadcastQueues) { @@ -13086,7 +13090,7 @@ public final class ActivityManagerService extends ActivityManagerNative              needSep = true;              printedAnything = true;          } -         +          if (!printedAnything) {              pw.println("  (nothing)");          } @@ -13426,7 +13430,7 @@ public final class ActivityManagerService extends ActivityManagerNative          long realtime = SystemClock.elapsedRealtime();          pw.println("Applications Graphics Acceleration Info:");          pw.println("Uptime: " + uptime + " Realtime: " + realtime); -         +          for (int i = procs.size() - 1 ; i >= 0 ; i--) {              ProcessRecord r = procs.get(i);              if (r.thread != null) { @@ -13651,7 +13655,7 @@ public final class ActivityManagerService extends ActivityManagerNative          boolean isCompact = false;          boolean localOnly = false;          boolean packages = false; -         +          int opti = 0;          while (opti < args.length) {              String opt = args[opti]; @@ -13689,7 +13693,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  pw.println("Unknown argument: " + opt + "; use -h for help");              }          } -         +          final boolean isCheckinRequest = scanArgs(args, "--checkin");          long uptime = SystemClock.uptimeMillis();          long realtime = SystemClock.elapsedRealtime(); @@ -14643,7 +14647,7 @@ public final class ActivityManagerService extends ActivityManagerNative          }          return restart;      } -     +      // =========================================================      // SERVICES      // ========================================================= @@ -14725,7 +14729,7 @@ public final class ActivityManagerService extends ActivityManagerNative              return mServices.peekServiceLocked(service, resolvedType);          }      } -     +      @Override      public boolean stopServiceToken(ComponentName className, IBinder token,              int startId) { @@ -14948,11 +14952,11 @@ public final class ActivityManagerService extends ActivityManagerNative              mServices.serviceDoneExecutingLocked((ServiceRecord)token, type, startId, res);          }      } -     +      // =========================================================      // BACKUP AND RESTORE      // ========================================================= -     +      // Cause the target app to be launched if necessary and its backup agent      // instantiated.  The backup agent will invoke backupAgentCreated() on the      // activity manager to announce its creation. @@ -15015,7 +15019,7 @@ public final class ActivityManagerService extends ActivityManagerNative              // mBackupAppName describe the app, so that when it binds back to the AM we              // know that it's scheduled for a backup-agent operation.          } -         +          return true;      } @@ -15322,7 +15326,7 @@ public final class ActivityManagerService extends ActivityManagerNative              mReceiverResolver.removeFilter(rl.get(i));          }      } -     +      private final void sendPackageBroadcastLocked(int cmd, String[] packages, int userId) {          for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {              ProcessRecord r = mLruProcesses.get(i); @@ -15746,10 +15750,10 @@ public final class ActivityManagerService extends ActivityManagerNative          final boolean replacePending =                  (intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0; -         +          if (DEBUG_BROADCAST) Slog.v(TAG, "Enqueing broadcast: " + intent.getAction()                  + " replacePending=" + replacePending); -         +          int NR = registeredReceivers != null ? registeredReceivers.size() : 0;          if (!ordered && NR > 0) {              // If we are not serializing this broadcast, then send the @@ -16014,7 +16018,7 @@ public final class ActivityManagerService extends ActivityManagerNative              Binder.restoreCallingIdentity(origId);          }      } -     +      // =========================================================      // INSTRUMENTATION      // ========================================================= @@ -16084,17 +16088,17 @@ public final class ActivityManagerService extends ActivityManagerNative          return true;      } -     +      /** -     * Report errors that occur while attempting to start Instrumentation.  Always writes the  +     * Report errors that occur while attempting to start Instrumentation.  Always writes the       * error to the logs, but if somebody is watching, send the report there too.  This enables       * the "am" command to report errors with more information. -     *  +     *       * @param watcher The IInstrumentationWatcher.  Null if there isn't one.       * @param cn The component name of the instrumentation.       * @param report The error report.       */ -    private void reportStartInstrumentationFailure(IInstrumentationWatcher watcher,  +    private void reportStartInstrumentationFailure(IInstrumentationWatcher watcher,              ComponentName cn, String report) {          Slog.w(TAG, report);          try { @@ -16164,7 +16168,7 @@ public final class ActivityManagerService extends ActivityManagerNative      // =========================================================      // CONFIGURATION      // ========================================================= -     +      public ConfigurationInfo getDeviceConfigurationInfo() {          ConfigurationInfo config = new ConfigurationInfo();          synchronized (this) { @@ -16264,11 +16268,11 @@ public final class ActivityManagerService extends ActivityManagerNative                  if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {                      Slog.i(TAG, "Updating configuration to: " + values);                  } -                 +                  EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);                  if (values.locale != null && !initLocale) { -                    saveLocaleLocked(values.locale,  +                    saveLocaleLocked(values.locale,                                       !values.locale.equals(mConfiguration.locale),                                       values.userSetLocale);                  } @@ -16284,7 +16288,7 @@ public final class ActivityManagerService extends ActivityManagerNative                  //mUsageStatsService.noteStartConfig(newConfig);                  final Configuration configCopy = new Configuration(mConfiguration); -                 +                  // TODO: If our config changes, should we auto dismiss any currently                  // showing dialogs?                  mShowDialogs = shouldShowDialogs(newConfig); @@ -17148,7 +17152,7 @@ public final class ActivityManagerService extends ActivityManagerNative          }          app.curRawAdj = adj; -         +          //Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +          //      " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);          if (adj > app.maxAdj) { @@ -17261,7 +17265,7 @@ public final class ActivityManagerService extends ActivityManagerNative              // whatever.          }      } -     +      /**       * Returns true if things are idle enough to perform GCs.       */ @@ -17275,7 +17279,7 @@ public final class ActivityManagerService extends ActivityManagerNative          return !processingBroadcasts                  && (isSleeping() || mStackSupervisor.allResumedActivitiesIdle());      } -     +      /**       * Perform GCs on all processes that are waiting for it, but only       * if things are idle. @@ -17304,11 +17308,11 @@ public final class ActivityManagerService extends ActivityManagerNative                      }                  }              } -             +              scheduleAppGcsLocked();          }      } -     +      /**       * If all looks good, perform GCs on all processes waiting for them.       */ @@ -17326,12 +17330,12 @@ public final class ActivityManagerService extends ActivityManagerNative       */      final void scheduleAppGcsLocked() {          mHandler.removeMessages(GC_BACKGROUND_PROCESSES_MSG); -         +          if (mProcessesToGc.size() > 0) {              // Schedule a GC for the time to the next process.              ProcessRecord proc = mProcessesToGc.get(0);              Message msg = mHandler.obtainMessage(GC_BACKGROUND_PROCESSES_MSG); -             +              long when = proc.lastRequestedGc + GC_MIN_INTERVAL;              long now = SystemClock.uptimeMillis();              if (when < (now+GC_TIMEOUT)) { @@ -17340,7 +17344,7 @@ public final class ActivityManagerService extends ActivityManagerNative              mHandler.sendMessageAtTime(msg, when);          }      } -     +      /**       * Add a process to the array of processes waiting to be GCed.  Keeps the       * list in sorted order by the last GC time.  The process can't already be @@ -17360,7 +17364,7 @@ public final class ActivityManagerService extends ActivityManagerNative              mProcessesToGc.add(0, proc);          }      } -     +      /**       * Set up to ask a process to GC itself.  This will either do it       * immediately, or put it on the list of processes to gc the next diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 19f6e5a303ed..4d7305d5a988 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3730,10 +3730,19 @@ final class ActivityStack {          // we just want to leave the official config object now in the          // activity and do nothing else.          int stackChanges = oldStackOverride.diff(mOverrideConfig); -        if (stackChanges == 0 && !oldStackOverride.equals(mOverrideConfig)) { -            // Assume size change if diff didn't report any changes, -            // but configurations are not equal. -            stackChanges = ActivityInfo.CONFIG_SCREEN_SIZE; +        if (stackChanges == 0) { +            // {@link Configuration#diff} doesn't catch changes from unset values. +            // Check for changes we care about. +            if (oldStackOverride.orientation != mOverrideConfig.orientation) { +                stackChanges |= ActivityInfo.CONFIG_ORIENTATION; +            } +            if (oldStackOverride.screenHeightDp != mOverrideConfig.screenHeightDp +                    || oldStackOverride.screenWidthDp != mOverrideConfig.screenWidthDp) { +                stackChanges |= ActivityInfo.CONFIG_SCREEN_SIZE; +            } +            if (oldStackOverride.smallestScreenWidthDp != mOverrideConfig.smallestScreenWidthDp) { +                stackChanges |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; +            }          }          final int changes = oldConfig.diff(newConfig) | stackChanges;          if (changes == 0 && !r.forceNewConfig) { @@ -3797,15 +3806,15 @@ final class ActivityStack {              return false;          } -        // Default case: the activity can handle this new configuration, so -        // hand it over.  Note that we don't need to give it the new -        // configuration, since we always send configuration changes to all -        // process when they happen so it can just use whatever configuration -        // it last got. +        // Default case: the activity can handle this new configuration, so hand it over. +        // NOTE: We only forward the stack override configuration as the system level configuration +        // changes is always sent to all processes when they happen so it can just use whatever +        // system level configuration it last got.          if (r.app != null && r.app.thread != null) {              try {                  if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); -                r.app.thread.scheduleActivityConfigurationChanged(r.appToken); +                r.app.thread.scheduleActivityConfigurationChanged( +                        r.appToken, new Configuration(mOverrideConfig));              } catch (RemoteException e) {                  // If process died, whatever.              } diff --git a/services/core/java/com/android/server/am/UserSwitchingDialog.java b/services/core/java/com/android/server/am/UserSwitchingDialog.java index 36263ece1f47..5a66f4a74d99 100644 --- a/services/core/java/com/android/server/am/UserSwitchingDialog.java +++ b/services/core/java/com/android/server/am/UserSwitchingDialog.java @@ -19,6 +19,8 @@ package com.android.server.am;  import android.app.AlertDialog;  import android.content.Context;  import android.content.res.Resources; +import android.os.Handler; +import android.os.Message;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewTreeObserver; @@ -26,6 +28,7 @@ import android.view.WindowManager;  import android.widget.TextView;  import com.android.internal.R; +import com.android.internal.annotations.GuardedBy;  /**   * Dialog to show when a user switch it about to happen. The intent is to snapshot the screen @@ -37,8 +40,14 @@ final class UserSwitchingDialog extends AlertDialog          implements ViewTreeObserver.OnWindowShownListener {      private static final String TAG = "ActivityManagerUserSwitchingDialog"; +    // Time to wait for the onWindowShown() callback before continuing the user switch +    private static final int WINDOW_SHOWN_TIMEOUT_MS = 3000; +      private final ActivityManagerService mService;      private final int mUserId; +    private static final int MSG_START_USER = 1; +    @GuardedBy("this") +    private boolean mStartedUser;      public UserSwitchingDialog(ActivityManagerService service, Context context,              int userId, String userName, boolean aboveSystem) { @@ -73,15 +82,40 @@ final class UserSwitchingDialog extends AlertDialog          if (decorView != null) {              decorView.getViewTreeObserver().addOnWindowShownListener(this);          } +        // Add a timeout as a safeguard, in case a race in screen on/off causes the window +        // callback to never come. +        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_USER), +                WINDOW_SHOWN_TIMEOUT_MS);      }      @Override      public void onWindowShown() {          // Slog.v(TAG, "onWindowShown called"); -        mService.startUserInForeground(mUserId, this); -        final View decorView = getWindow().getDecorView(); -        if (decorView != null) { -            decorView.getViewTreeObserver().removeOnWindowShownListener(this); +        startUser(); +    } + +    void startUser() { +        synchronized (this) { +            if (!mStartedUser) { +                mService.startUserInForeground(mUserId, this); +                mStartedUser = true; +                final View decorView = getWindow().getDecorView(); +                if (decorView != null) { +                    decorView.getViewTreeObserver().removeOnWindowShownListener(this); +                } +                mHandler.removeMessages(MSG_START_USER); +            }          }      } + +    private final Handler mHandler = new Handler() { +        @Override +        public void handleMessage(Message msg) { +            switch (msg.what) { +                case MSG_START_USER: +                    startUser(); +                    break; +            } +        } +    };  } diff --git a/media/java/android/media/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 3e91e4c46939..eaece09c5ac7 100644 --- a/media/java/android/media/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package android.media; +package com.android.server.audio;  import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK;  import static android.media.AudioManager.RINGER_MODE_NORMAL; @@ -46,8 +46,30 @@ import android.hardware.hdmi.HdmiControlManager;  import android.hardware.hdmi.HdmiPlaybackClient;  import android.hardware.hdmi.HdmiTvClient;  import android.hardware.usb.UsbManager; +import android.media.AudioAttributes; +import android.media.AudioDevicePort; +import android.media.AudioSystem; +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioManagerInternal; +import android.media.AudioPort; +import android.media.AudioRoutesInfo; +import android.media.AudioSystem; +import android.media.IAudioFocusDispatcher; +import android.media.IAudioRoutesObserver; +import android.media.IAudioService; +import android.media.IRemoteControlDisplay; +import android.media.IRingtonePlayer; +import android.media.IVolumeController; +import android.media.MediaPlayer; +import android.media.SoundPool; +import android.media.AudioAttributes.Builder; +import android.media.AudioManagerInternal.RingerModeDelegate; +import android.media.AudioSystem.ErrorCallback; +import android.media.IAudioService.Stub;  import android.media.MediaPlayer.OnCompletionListener;  import android.media.MediaPlayer.OnErrorListener; +import android.media.SoundPool.OnLoadCompleteListener;  import android.media.audiopolicy.AudioMix;  import android.media.audiopolicy.AudioPolicy;  import android.media.audiopolicy.AudioPolicyConfig; @@ -135,13 +157,8 @@ public class AudioService extends IAudioService.Stub {      /** How long to delay before persisting a change in volume/ringer mode. */      private static final int PERSIST_DELAY = 500; -    /** -     * The delay before playing a sound. This small period exists so the user -     * can press another key (non-volume keys, too) to have it NOT be audible. -     * <p> -     * PhoneWindow will implement this part. -     */ -    public static final int PLAY_SOUND_DELAY = 300; +    /** How long to delay after a volume down event before unmuting a stream */ +    private static final int UNMUTE_STREAM_DELAY = 350;      /**       * Only used in the result from {@link #checkForRingerModeChange(int, int, int)} @@ -152,21 +169,15 @@ public class AudioService extends IAudioService.Stub {      private final ContentResolver mContentResolver;      private final AppOpsManager mAppOps; -    // the platform has no specific capabilities -    public static final int PLATFORM_DEFAULT = 0; -    // the platform is voice call capable (a phone) -    public static final int PLATFORM_VOICE = 1; -    // the platform is a television or a set-top box -    public static final int PLATFORM_TELEVISION = 2;      // the platform type affects volume and silent mode behavior      private final int mPlatformType;      private boolean isPlatformVoice() { -        return mPlatformType == PLATFORM_VOICE; +        return mPlatformType == AudioSystem.PLATFORM_VOICE;      }      private boolean isPlatformTelevision() { -        return mPlatformType == PLATFORM_TELEVISION; +        return mPlatformType == AudioSystem.PLATFORM_TELEVISION;      }      /** The controller for the volume UI. */ @@ -205,6 +216,7 @@ public class AudioService extends IAudioService.Stub {      private static final int MSG_SYSTEM_READY = 21;      private static final int MSG_PERSIST_MUSIC_ACTIVE_MS = 22;      private static final int MSG_PERSIST_MICROPHONE_MUTE = 23; +    private static final int MSG_UNMUTE_STREAM = 24;      // start of messages handled under wakelock      //   these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),      //   and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) @@ -263,19 +275,6 @@ public class AudioService extends IAudioService.Stub {          15  // STREAM_TTS      }; -    private static int[] DEFAULT_STREAM_VOLUME = new int[] { -        4,  // STREAM_VOICE_CALL -        7,  // STREAM_SYSTEM -        5,  // STREAM_RING -        11, // STREAM_MUSIC -        6,  // STREAM_ALARM -        5,  // STREAM_NOTIFICATION -        7,  // STREAM_BLUETOOTH_SCO -        7,  // STREAM_SYSTEM_ENFORCED -        11, // STREAM_DTMF -        11  // STREAM_TTS -    }; -      /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings       * of another stream: This avoids multiplying the volume settings for hidden       * stream types that follow other stream behavior for volume settings @@ -342,26 +341,6 @@ public class AudioService extends IAudioService.Stub {      private final boolean mUseFixedVolume; -    // stream names used by dumpStreamStates() -    private static final String[] STREAM_NAMES = new String[] { -            "STREAM_VOICE_CALL", -            "STREAM_SYSTEM", -            "STREAM_RING", -            "STREAM_MUSIC", -            "STREAM_ALARM", -            "STREAM_NOTIFICATION", -            "STREAM_BLUETOOTH_SCO", -            "STREAM_SYSTEM_ENFORCED", -            "STREAM_DTMF", -            "STREAM_TTS" -    }; - -    public static final int DEFAULT_MUTE_STREAMS_AFFECTED = -            (1 << AudioSystem.STREAM_MUSIC) | -            (1 << AudioSystem.STREAM_RING) | -            (1 << AudioSystem.STREAM_NOTIFICATION) | -            (1 << AudioSystem.STREAM_SYSTEM); -      private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {          public void onError(int error) {              switch (error) { @@ -566,7 +545,7 @@ public class AudioService extends IAudioService.Stub {          mContentResolver = context.getContentResolver();          mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); -        mPlatformType = getPlatformType(context); +        mPlatformType = AudioSystem.getPlatformType(context);          PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);          mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent"); @@ -579,13 +558,13 @@ public class AudioService extends IAudioService.Stub {                  MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]);          if (maxVolume != MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]) {              MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = maxVolume; -            DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = (maxVolume * 3) / 4; +            AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = (maxVolume * 3) / 4;          }          maxVolume = SystemProperties.getInt("ro.config.media_vol_steps",                  MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]);          if (maxVolume != MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {              MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = maxVolume; -            DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = (maxVolume * 3) / 4; +            AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = (maxVolume * 3) / 4;          }          sSoundEffectVolumeDb = context.getResources().getInteger( @@ -679,26 +658,6 @@ public class AudioService extends IAudioService.Stub {          LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());      } -    /** -     * Return the platform type that this is running on. One of: -     * <ul> -     * <li>{@link #PLATFORM_VOICE}</li> -     * <li>{@link #PLATFORM_TELEVISION}</li> -     * <li>{@link #PLATFORM_DEFAULT}</li> -     * </ul> -     */ -    public static int getPlatformType(Context context) { -        if (context.getResources().getBoolean( -                com.android.internal.R.bool.config_voice_capable)) { -            return PLATFORM_VOICE; -        } else if (context.getPackageManager().hasSystemFeature( -                                                            PackageManager.FEATURE_LEANBACK)) { -            return PLATFORM_TELEVISION; -        } else { -            return PLATFORM_DEFAULT; -        } -    } -      public void systemReady() {          sendMsg(mAudioHandler, MSG_SYSTEM_READY, SENDMSG_QUEUE,                  0, 0, null, 0); @@ -815,7 +774,7 @@ public class AudioService extends IAudioService.Stub {          pw.println("\nStream volumes (device: index)");          int numStreamTypes = AudioSystem.getNumStreamTypes();          for (int i = 0; i < numStreamTypes; i++) { -            pw.println("- "+STREAM_NAMES[i]+":"); +            pw.println("- " + AudioSystem.STREAM_NAMES[i] + ":");              mStreamStates[i].dump(pw);              pw.println("");          } @@ -823,22 +782,15 @@ public class AudioService extends IAudioService.Stub {          pw.println(Integer.toHexString(mMuteAffectedStreams));      } -    /** @hide */ -    public static String streamToString(int stream) { -        if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream]; -        if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE"; -        return "UNKNOWN_STREAM_" + stream; -    } -      private void updateStreamVolumeAlias(boolean updateVolumes) {          int dtmfStreamAlias;          switch (mPlatformType) { -        case PLATFORM_VOICE: +        case AudioSystem.PLATFORM_VOICE:              mStreamVolumeAlias = STREAM_VOLUME_ALIAS_VOICE;              dtmfStreamAlias = AudioSystem.STREAM_RING;              break; -        case PLATFORM_TELEVISION: +        case AudioSystem.PLATFORM_TELEVISION:              mStreamVolumeAlias = STREAM_VOLUME_ALIAS_TELEVISION;              dtmfStreamAlias = AudioSystem.STREAM_MUSIC;              break; @@ -917,11 +869,11 @@ public class AudioService extends IAudioService.Stub {              // System.VIBRATE_ON is not used any more but defaults for mVibrateSetting              // are still needed while setVibrateSetting() and getVibrateSetting() are being              // deprecated. -            mVibrateSetting = getValueForVibrateSetting(0, +            mVibrateSetting = AudioSystem.getValueForVibrateSetting(0,                                              AudioManager.VIBRATE_TYPE_NOTIFICATION,                                              mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT                                                              : AudioManager.VIBRATE_SETTING_OFF); -            mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, +            mVibrateSetting = AudioSystem.getValueForVibrateSetting(mVibrateSetting,                                              AudioManager.VIBRATE_TYPE_RINGER,                                              mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT                                                              : AudioManager.VIBRATE_SETTING_OFF); @@ -931,7 +883,7 @@ public class AudioService extends IAudioService.Stub {          }          mMuteAffectedStreams = System.getIntForUser(cr, -                System.MUTE_STREAMS_AFFECTED, DEFAULT_MUTE_STREAMS_AFFECTED, +                System.MUTE_STREAMS_AFFECTED, AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED,                  UserHandle.USER_CURRENT);          boolean masterMute = System.getIntForUser(cr, System.VOLUME_MASTER_MUTE, @@ -1109,9 +1061,9 @@ public class AudioService extends IAudioService.Stub {              if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {                  flags &= ~AudioManager.FLAG_VIBRATE;              } -            // Check if the ringer mode changes with this volume adjustment. If -            // it does, it will handle adjusting the volume, so we won't below -            final int result = checkForRingerModeChange(aliasIndex, direction, step); +            // Check if the ringer mode handles this adjustment. If it does we don't +            // need to adjust the volume further. +            final int result = checkForRingerModeChange(aliasIndex, direction, step, streamState.mIsMuted);              adjustVolume = (result & FLAG_ADJUST_VOLUME) != 0;              // If suppressing a volume adjustment in silent mode, display the UI hint              if ((result & AudioManager.FLAG_SHOW_SILENT_HINT) != 0) { @@ -1126,6 +1078,7 @@ public class AudioService extends IAudioService.Stub {          int oldIndex = mStreamStates[streamType].getIndex(device);          if (adjustVolume && (direction != AudioManager.ADJUST_SAME)) { +            mAudioHandler.removeMessages(MSG_UNMUTE_STREAM);              // Check if volume update should be send to AVRCP              if (streamTypeAlias == AudioSystem.STREAM_MUSIC && @@ -1167,7 +1120,13 @@ public class AudioService extends IAudioService.Stub {                  // message to persist).                  if (streamState.mIsMuted) {                      // Unmute the stream if it was previously muted -                    streamState.mute(false); +                    if (direction == AudioManager.ADJUST_RAISE) { +                        // unmute immediately for volume up +                        streamState.mute(false); +                    } else if (direction == AudioManager.ADJUST_LOWER) { +                        sendMsg(mAudioHandler, MSG_UNMUTE_STREAM, SENDMSG_QUEUE, +                                streamTypeAlias, flags, null, UNMUTE_STREAM_DELAY); +                    }                  }                  sendMsg(mAudioHandler,                          MSG_SET_DEVICE_VOLUME, @@ -1203,6 +1162,16 @@ public class AudioService extends IAudioService.Stub {          sendVolumeUpdate(streamType, oldIndex, index, flags);      } +    // Called after a delay when volume down is pressed while muted +    private void onUnmuteStream(int stream, int flags) { +        VolumeStreamState streamState = mStreamStates[stream]; +        streamState.mute(false); + +        final int device = getDeviceForStream(stream); +        final int index = mStreamStates[stream].getIndex(device); +        sendVolumeUpdate(stream, index, index, flags); +    } +      private void setSystemAudioVolume(int oldVolume, int newVolume, int maxVolume, int flags) {          if (mHdmiManager == null                  || mHdmiTvClient == null @@ -1725,10 +1694,6 @@ public class AudioService extends IAudioService.Stub {          return MAX_STREAM_VOLUME[streamType];      } -    public static int getDefaultStreamVolume(int streamType) { -        return DEFAULT_STREAM_VOLUME[streamType]; -    } -      /** @see AudioManager#getStreamVolume(int) */      public int getStreamVolume(int streamType) {          ensureValidStreamType(streamType); @@ -2023,29 +1988,14 @@ public class AudioService extends IAudioService.Stub {          if (!mHasVibrator) return; -        mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting); +        mVibrateSetting = AudioSystem.getValueForVibrateSetting(mVibrateSetting, vibrateType, +                vibrateSetting);          // Broadcast change          broadcastVibrateSetting(vibrateType);      } -    /** -     * @see #setVibrateSetting(int, int) -     */ -    public static int getValueForVibrateSetting(int existingValue, int vibrateType, -            int vibrateSetting) { - -        // First clear the existing setting. Each vibrate type has two bits in -        // the value. Note '3' is '11' in binary. -        existingValue &= ~(3 << (vibrateType * 2)); - -        // Set into the old value -        existingValue |= (vibrateSetting & 3) << (vibrateType * 2); - -        return existingValue; -    } -      private class SetModeDeathHandler implements IBinder.DeathRecipient {          private IBinder mCb; // To be notified of client's death          private int mPid; @@ -3107,7 +3057,7 @@ public class AudioService extends IAudioService.Stub {       * adjusting volume. If so, this will set the proper ringer mode and volume       * indices on the stream states.       */ -    private int checkForRingerModeChange(int oldIndex, int direction,  int step) { +    private int checkForRingerModeChange(int oldIndex, int direction,  int step, boolean isMuted) {          int result = FLAG_ADJUST_VOLUME;          int ringerMode = getRingerModeInternal(); @@ -3131,6 +3081,15 @@ public class AudioService extends IAudioService.Stub {                          ringerMode = RINGER_MODE_SILENT;                      }                  } +            } else if (direction == AudioManager.ADJUST_TOGGLE_MUTE +                    || direction == AudioManager.ADJUST_MUTE) { +                if (mHasVibrator) { +                    ringerMode = RINGER_MODE_VIBRATE; +                } else { +                    ringerMode = RINGER_MODE_SILENT; +                } +                // Setting the ringer mode will toggle mute +                result &= ~FLAG_ADJUST_VOLUME;              }              break;          case RINGER_MODE_VIBRATE: @@ -3140,26 +3099,38 @@ public class AudioService extends IAudioService.Stub {                  break;              }              if ((direction == AudioManager.ADJUST_LOWER)) { -                if (mPrevVolDirection != AudioManager.ADJUST_LOWER) { +                // This is the case we were muted with the volume turned up +                if (oldIndex >= 2 * step && isMuted) { +                    ringerMode = RINGER_MODE_NORMAL; +                } else if (mPrevVolDirection != AudioManager.ADJUST_LOWER) {                      if (VOLUME_SETS_RINGER_MODE_SILENT) {                          ringerMode = RINGER_MODE_SILENT;                      } else {                          result |= AudioManager.FLAG_SHOW_VIBRATE_HINT;                      }                  } -            } else if (direction == AudioManager.ADJUST_RAISE) { +            } else if (direction == AudioManager.ADJUST_RAISE +                    || direction == AudioManager.ADJUST_TOGGLE_MUTE +                    || direction == AudioManager.ADJUST_UNMUTE) {                  ringerMode = RINGER_MODE_NORMAL;              }              result &= ~FLAG_ADJUST_VOLUME;              break;          case RINGER_MODE_SILENT: -            if (direction == AudioManager.ADJUST_RAISE) { +            if (direction == AudioManager.ADJUST_LOWER && oldIndex >= 2 * step && isMuted) { +                // This is the case we were muted with the volume turned up +                ringerMode = RINGER_MODE_NORMAL; +            } else if (direction == AudioManager.ADJUST_RAISE +                    || direction == AudioManager.ADJUST_TOGGLE_MUTE +                    || direction == AudioManager.ADJUST_UNMUTE) {                  if (PREVENT_VOLUME_ADJUSTMENT_IF_SILENT) {                      result |= AudioManager.FLAG_SHOW_SILENT_HINT;                  } else { -                  if (mHasVibrator) { +                  if (mHasVibrator && direction == AudioManager.ADJUST_RAISE) {                        ringerMode = RINGER_MODE_VIBRATE;                    } else { +                      // If we don't have a vibrator or they were toggling mute +                      // go straight back to normal.                        ringerMode = RINGER_MODE_NORMAL;                    }                  } @@ -3203,7 +3174,7 @@ public class AudioService extends IAudioService.Stub {                                          (1 << AudioSystem.STREAM_SYSTEM);          switch (mPlatformType) { -            case PLATFORM_TELEVISION: +            case AudioSystem.PLATFORM_TELEVISION:                  ringerModeAffectedStreams = 0;                  break;              default: @@ -3296,7 +3267,7 @@ public class AudioService extends IAudioService.Stub {      private int getActiveStreamType(int suggestedStreamType) {          switch (mPlatformType) { -        case PLATFORM_VOICE: +        case AudioSystem.PLATFORM_VOICE:              if (isInCommunication()) {                  if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)                          == AudioSystem.FORCE_BT_SCO) { @@ -3322,7 +3293,7 @@ public class AudioService extends IAudioService.Stub {                  return AudioSystem.STREAM_MUSIC;              }              break; -        case PLATFORM_TELEVISION: +        case AudioSystem.PLATFORM_TELEVISION:              if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {                      // TV always defaults to STREAM_MUSIC                      return AudioSystem.STREAM_MUSIC; @@ -3557,7 +3528,7 @@ public class AudioService extends IAudioService.Stub {                  // only be stale values                  if ((mStreamType == AudioSystem.STREAM_SYSTEM) ||                          (mStreamType == AudioSystem.STREAM_SYSTEM_ENFORCED)) { -                    int index = 10 * DEFAULT_STREAM_VOLUME[mStreamType]; +                    int index = 10 * AudioSystem.DEFAULT_STREAM_VOLUME[mStreamType];                      synchronized (mCameraSoundForced) {                          if (mCameraSoundForced) {                              index = mIndexMax; @@ -3581,7 +3552,7 @@ public class AudioService extends IAudioService.Stub {                      // if no volume stored for current stream and device, use default volume if default                      // device, continue otherwise                      int defaultIndex = (device == AudioSystem.DEVICE_OUT_DEFAULT) ? -                                            DEFAULT_STREAM_VOLUME[mStreamType] : -1; +                            AudioSystem.DEFAULT_STREAM_VOLUME[mStreamType] : -1;                      int index = Settings.System.getIntForUser(                              mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT);                      if (index == -1) { @@ -4384,6 +4355,9 @@ public class AudioService extends IAudioService.Stub {                                                   msg.arg1,                                                   msg.arg2);                      break; +                case MSG_UNMUTE_STREAM: +                    onUnmuteStream(msg.arg1, msg.arg2); +                    break;              }          }      } @@ -4452,8 +4426,8 @@ public class AudioService extends IAudioService.Stub {          mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);          synchronized (mCurAudioRoutes) {              // Remove A2DP routes as well -            if (mCurAudioRoutes.mBluetoothName != null) { -                mCurAudioRoutes.mBluetoothName = null; +            if (mCurAudioRoutes.bluetoothName != null) { +                mCurAudioRoutes.bluetoothName = null;                  sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,                          SENDMSG_NOOP, 0, 0, null, 0);              } @@ -4533,8 +4507,8 @@ public class AudioService extends IAudioService.Stub {                      makeA2dpDeviceUnavailableNow(address);                  }                  synchronized (mCurAudioRoutes) { -                    if (mCurAudioRoutes.mBluetoothName != null) { -                        mCurAudioRoutes.mBluetoothName = null; +                    if (mCurAudioRoutes.bluetoothName != null) { +                        mCurAudioRoutes.bluetoothName = null;                          sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,                                  SENDMSG_NOOP, 0, 0, null, 0);                      } @@ -4555,8 +4529,8 @@ public class AudioService extends IAudioService.Stub {                  makeA2dpDeviceAvailable(address);                  synchronized (mCurAudioRoutes) {                      String name = btDevice.getAliasName(); -                    if (!TextUtils.equals(mCurAudioRoutes.mBluetoothName, name)) { -                        mCurAudioRoutes.mBluetoothName = name; +                    if (!TextUtils.equals(mCurAudioRoutes.bluetoothName, name)) { +                        mCurAudioRoutes.bluetoothName = name;                          sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,                                  SENDMSG_NOOP, 0, 0, null, 0);                      } @@ -4607,7 +4581,7 @@ public class AudioService extends IAudioService.Stub {      private boolean handleDeviceConnection(boolean connect, int device, String address, String deviceName) {          Slog.i(TAG, "handleDeviceConnection(" + connect +                  " dev:" + Integer.toHexString(device) + -                " address:" + address +  +                " address:" + address +                  " name:" + deviceName + ")");          synchronized (mConnectedDevices) {              boolean isConnected = (mConnectedDevices.containsKey(device) && @@ -4712,14 +4686,14 @@ public class AudioService extends IAudioService.Stub {          synchronized (mCurAudioRoutes) {              if (connType != 0) { -                int newConn = mCurAudioRoutes.mMainType; +                int newConn = mCurAudioRoutes.mainType;                  if (state != 0) {                      newConn |= connType;                  } else {                      newConn &= ~connType;                  } -                if (newConn != mCurAudioRoutes.mMainType) { -                    mCurAudioRoutes.mMainType = newConn; +                if (newConn != mCurAudioRoutes.mainType) { +                    mCurAudioRoutes.mainType = newConn;                      sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,                              SENDMSG_NOOP, 0, 0, null, 0);                  } @@ -5051,7 +5025,7 @@ public class AudioService extends IAudioService.Stub {              IAudioPolicyCallback pcb) {          // permission checks          if ((flags & AudioManager.AUDIOFOCUS_FLAG_LOCK) == AudioManager.AUDIOFOCUS_FLAG_LOCK) { -            if (mMediaFocusControl.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) { +            if (AudioSystem.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {                  if (PackageManager.PERMISSION_GRANTED != mContext.checkCallingOrSelfPermission(                              android.Manifest.permission.MODIFY_PHONE_STATE)) {                      Log.e(TAG, "Invalid permission to (un)lock audio focus", new Exception()); @@ -5519,8 +5493,8 @@ public class AudioService extends IAudioService.Stub {          dumpStreamStates(pw);          dumpRingerMode(pw);          pw.println("\nAudio routes:"); -        pw.print("  mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mMainType)); -        pw.print("  mBluetoothName="); pw.println(mCurAudioRoutes.mBluetoothName); +        pw.print("  mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mainType)); +        pw.print("  mBluetoothName="); pw.println(mCurAudioRoutes.bluetoothName);          pw.println("\nOther state:");          pw.print("  mVolumeController="); pw.println(mVolumeController); diff --git a/media/java/android/media/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java index bbe5fd225c17..49be879b93c7 100644 --- a/media/java/android/media/FocusRequester.java +++ b/services/core/java/com/android/server/audio/FocusRequester.java @@ -14,13 +14,18 @@   * limitations under the License.   */ -package android.media; +package com.android.server.audio;  import android.annotation.NonNull; -import android.media.MediaFocusControl.AudioFocusDeathHandler; +import android.media.AudioAttributes; +import android.media.AudioFocusInfo; +import android.media.AudioManager; +import android.media.IAudioFocusDispatcher;  import android.os.IBinder;  import android.util.Log; +import com.android.server.audio.MediaFocusControl.AudioFocusDeathHandler; +  import java.io.PrintWriter;  /** @@ -29,7 +34,7 @@ import java.io.PrintWriter;   * instance is managed by android.media.MediaFocusControl, from its addition to the audio focus   * stack to its release.   */ -class FocusRequester { +public class FocusRequester {      // on purpose not using this classe's name, as it will only be used from MediaFocusControl      private static final String TAG = "MediaFocusControl"; diff --git a/media/java/android/media/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index 6518bd162e39..24e1ace8c275 100644 --- a/media/java/android/media/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package android.media; +package com.android.server.audio;  import android.app.Activity;  import android.app.ActivityManager; @@ -32,7 +32,17 @@ import android.content.Intent;  import android.content.IntentFilter;  import android.content.pm.PackageManager;  import android.database.ContentObserver; -import android.media.PlayerRecord.RemotePlaybackState; +import android.media.AudioAttributes; +import android.media.AudioFocusInfo; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.media.IAudioFocusDispatcher; +import android.media.IAudioService; +import android.media.IRemoteControlClient; +import android.media.IRemoteControlDisplay; +import android.media.IRemoteVolumeObserver; +import android.media.RemoteControlClient; +import android.media.AudioManager.OnAudioFocusChangeListener;  import android.media.audiopolicy.IAudioPolicyCallback;  import android.net.Uri;  import android.os.Binder; @@ -53,6 +63,8 @@ import android.util.Log;  import android.util.Slog;  import android.view.KeyEvent; +import com.android.server.audio.PlayerRecord.RemotePlaybackState; +  import java.io.PrintWriter;  import java.util.ArrayList;  import java.util.Iterator; @@ -391,13 +403,6 @@ public class MediaFocusControl implements OnFinished {      // AudioFocus      //========================================================================================== -    /** -     * Constant to identify a focus stack entry that is used to hold the focus while the phone -     * is ringing or during a call. Used by com.android.internal.telephony.CallManager when -     * entering and exiting calls. -     */ -    protected final static String IN_VOICE_COMM_FOCUS_ID = "AudioFocus_For_Phone_Ring_And_Calls"; -      private final static Object mAudioFocusLock = new Object();      private final static Object mRingingLock = new Object(); @@ -565,7 +570,7 @@ public class MediaFocusControl implements OnFinished {      }      private boolean isLockedFocusOwner(FocusRequester fr) { -        return (fr.hasSameClient(IN_VOICE_COMM_FOCUS_ID) || fr.isLockedFocusOwner()); +        return (fr.hasSameClient(AudioSystem.IN_VOICE_COMM_FOCUS_ID) || fr.isLockedFocusOwner());      }      /** diff --git a/media/java/android/media/PlayerRecord.java b/services/core/java/com/android/server/audio/PlayerRecord.java index 664ddcf7362c..a7dbbd188c6c 100644 --- a/media/java/android/media/PlayerRecord.java +++ b/services/core/java/com/android/server/audio/PlayerRecord.java @@ -14,10 +14,14 @@   * limitations under the License.   */ -package android.media; +package com.android.server.audio;  import android.app.PendingIntent;  import android.content.ComponentName; +import android.media.AudioManager; +import android.media.IRemoteControlClient; +import android.media.IRemoteVolumeObserver; +import android.media.RemoteControlClient;  import android.os.Binder;  import android.os.IBinder;  import android.os.IBinder.DeathRecipient; diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index bd0e58768ae5..709ca4bfc6c4 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -847,9 +847,29 @@ public class Vpn {      /**       * Start legacy VPN, controlling native daemons as needed. Creates a       * secondary thread to perform connection work, returning quickly. +     * +     * Should only be called to respond to Binder requests as this enforces caller permission. Use +     * {@link #startLegacyVpnPrivileged(VpnProfile, KeyStore, LinkProperties)} to skip the +     * permission check only when the caller is trusted (or the call is initiated by the system).       */      public void startLegacyVpn(VpnProfile profile, KeyStore keyStore, LinkProperties egress) {          enforceControlPermission(); +        long token = Binder.clearCallingIdentity(); +        try { +            startLegacyVpnPrivileged(profile, keyStore, egress); +        } finally { +            Binder.restoreCallingIdentity(token); +        } +    } + +    /** +     * Like {@link #startLegacyVpn(VpnProfile, KeyStore, LinkProperties)}, but does not check +     * permissions under the assumption that the caller is the system. +     * +     * Callers are responsible for checking permissions if needed. +     */ +    public void startLegacyVpnPrivileged(VpnProfile profile, KeyStore keyStore, +            LinkProperties egress) {          if (!keyStore.isUnlocked()) {              throw new IllegalStateException("KeyStore isn't unlocked");          } @@ -960,10 +980,10 @@ public class Vpn {      }      private synchronized void startLegacyVpn(VpnConfig config, String[] racoon, String[] mtpd) { -        stopLegacyVpn(); +        stopLegacyVpnPrivileged(); -        // Prepare for the new request. This also checks the caller. -        prepare(null, VpnConfig.LEGACY_VPN); +        // Prepare for the new request. +        prepareInternal(VpnConfig.LEGACY_VPN);          updateState(DetailedState.CONNECTING, "startLegacyVpn");          // Start a new LegacyVpnRunner and we are done! @@ -971,7 +991,8 @@ public class Vpn {          mLegacyVpnRunner.start();      } -    public synchronized void stopLegacyVpn() { +    /** Stop legacy VPN. Permissions must be checked by callers. */ +    public synchronized void stopLegacyVpnPrivileged() {          if (mLegacyVpnRunner != null) {              mLegacyVpnRunner.exit();              mLegacyVpnRunner = null; diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 0c86aed1c15b..e434f396fc8f 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -214,6 +214,10 @@ final class Constants {      //     values which denotes the device type in HDMI Spec 1.4.      static final String PROPERTY_DEVICE_TYPE = "ro.hdmi.device_type"; +    // Set to false to allow playback device to go to suspend mode even +    // when it's an active source. True by default. +    static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake"; +      static final int RECORDING_TYPE_DIGITAL_RF = 1;      static final int RECORDING_TYPE_ANALOGUE_RF = 2;      static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index a8f6954405c3..1e43670992fe 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -38,9 +38,11 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {      // Used to keep the device awake while it is the active source. For devices that      // cannot wake up via CEC commands, this address the inconvenience of having to -    // turn them on. +    // turn them on. True by default, and can be disabled (i.e. device can go to sleep +    // in active device status) by explicitly setting the system property +    // persist.sys.hdmi.keep_awake to false.      // Lazily initialized - should call getWakeLock() to get the instance. -    private WakeLock mWakeLock; +    private ActiveWakeLock mWakeLock;      HdmiCecLocalDevicePlayback(HdmiControlService service) {          super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -142,19 +144,30 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {          mIsActiveSource = on;          if (on) {              getWakeLock().acquire(); -            HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);          } else {              getWakeLock().release(); -            HdmiLogger.debug("Wake lock released");          }      }      @ServiceThreadOnly -    private WakeLock getWakeLock() { +    private ActiveWakeLock getWakeLock() {          assertRunOnServiceThread();          if (mWakeLock == null) { -            mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); -            mWakeLock.setReferenceCounted(false); +            if (SystemProperties.getBoolean(Constants.PROPERTY_KEEP_AWAKE, true)) { +                mWakeLock = new SystemWakeLock(); +            } else { +                // Create a dummy lock object that doesn't do anything about wake lock, +                // hence allows the device to go to sleep even if it's the active source. +                mWakeLock = new ActiveWakeLock() { +                    @Override +                    public void acquire() { } +                    @Override +                    public void release() { } +                    @Override +                    public boolean isHeld() { return false; } +                }; +                HdmiLogger.debug("No wakelock is used to keep the display on."); +            }          }          return mWakeLock;      } @@ -258,4 +271,36 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice {          super.dump(pw);          pw.println("mIsActiveSource: " + mIsActiveSource);      } + +    // Wrapper interface over PowerManager.WakeLock +    private interface ActiveWakeLock { +        void acquire(); +        void release(); +        boolean isHeld(); +    } + +    private class SystemWakeLock implements ActiveWakeLock { +        private final WakeLock mWakeLock; +        public SystemWakeLock() { +            mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); +            mWakeLock.setReferenceCounted(false); +        } + +        @Override +        public void acquire() { +            mWakeLock.acquire(); +            HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource); +        } + +        @Override +        public void release() { +            mWakeLock.release(); +            HdmiLogger.debug("Wake lock released"); +        } + +        @Override +        public boolean isHeld() { +            return mWakeLock.isHeld(); +        } +    }  } diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java index e41b3da39310..65693b4d4f0c 100644 --- a/services/core/java/com/android/server/location/GpsLocationProvider.java +++ b/services/core/java/com/android/server/location/GpsLocationProvider.java @@ -785,9 +785,7 @@ public class GpsLocationProvider implements LocationProviderInterface {          }          if (info != null) { -            boolean dataEnabled = TelephonyManager.getIntWithSubId(mContext.getContentResolver(), -                    Settings.Global.MOBILE_DATA, SubscriptionManager.getDefaultSubId(), -                    1) == 1; +            boolean dataEnabled = TelephonyManager.getDefault().getDataEnabled();              boolean networkAvailable = info.isAvailable() && dataEnabled;              String defaultApn = getSelectedApn();              if (defaultApn == null) { diff --git a/services/core/java/com/android/server/net/LockdownVpnTracker.java b/services/core/java/com/android/server/net/LockdownVpnTracker.java index 3a1e4a4301ed..752614f2ec58 100644 --- a/services/core/java/com/android/server/net/LockdownVpnTracker.java +++ b/services/core/java/com/android/server/net/LockdownVpnTracker.java @@ -140,7 +140,7 @@ public class LockdownVpnTracker {          if (egressDisconnected || egressChanged) {              clearSourceRulesLocked();              mAcceptedEgressIface = null; -            mVpn.stopLegacyVpn(); +            mVpn.stopLegacyVpnPrivileged();          }          if (egressDisconnected) {              hideNotification(); @@ -163,7 +163,9 @@ public class LockdownVpnTracker {                  mAcceptedEgressIface = egressProp.getInterfaceName();                  try { -                    mVpn.startLegacyVpn(mProfile, KeyStore.getInstance(), egressProp); +                    // Use the privileged method because Lockdown VPN is initiated by the system, so +                    // no additional permission checks are necessary. +                    mVpn.startLegacyVpnPrivileged(mProfile, KeyStore.getInstance(), egressProp);                  } catch (IllegalStateException e) {                      mAcceptedEgressIface = null;                      Slog.e(TAG, "Failed to start VPN", e); @@ -250,7 +252,7 @@ public class LockdownVpnTracker {          mAcceptedEgressIface = null;          mErrorCount = 0; -        mVpn.stopLegacyVpn(); +        mVpn.stopLegacyVpnPrivileged();          try {              mNetService.setFirewallEgressDestRule(mProfile.server, 500, false);              mNetService.setFirewallEgressDestRule(mProfile.server, 4500, false); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 359359e3c0ee..12c431589a65 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8659,7 +8659,11 @@ public class PackageManagerService extends IPackageManager.Stub {                          if (DEBUG_INSTALL) Log.v(TAG, "token " + token                                  + " to BM for possible restore");                          try { -                            bm.restoreAtInstall(res.pkg.applicationInfo.packageName, token); +                            if (bm.isBackupServiceActive(UserHandle.USER_OWNER)) { +                                bm.restoreAtInstall(res.pkg.applicationInfo.packageName, token); +                            } else { +                                doRestore = false; +                            }                          } catch (RemoteException e) {                              // can't happen; the backup manager is local                          } catch (Exception e) { diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/services/core/java/com/android/server/policy/BarController.java index bfbd60d1c82a..bca2c1627416 100644 --- a/policy/src/com/android/internal/policy/impl/BarController.java +++ b/services/core/java/com/android/server/policy/BarController.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.app.StatusBarManager;  import android.os.Handler; diff --git a/policy/src/com/android/internal/policy/impl/EnableAccessibilityController.java b/services/core/java/com/android/server/policy/EnableAccessibilityController.java index 6f79f587d163..da9c001ea58f 100644 --- a/policy/src/com/android/internal/policy/impl/EnableAccessibilityController.java +++ b/services/core/java/com/android/server/policy/EnableAccessibilityController.java @@ -14,7 +14,7 @@   * the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.accessibilityservice.AccessibilityServiceInfo;  import android.app.ActivityManager; diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java index 20a2c9f76b78..d768fe36928f 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/services/core/java/com/android/server/policy/GlobalActions.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import com.android.internal.app.AlertController;  import com.android.internal.app.AlertController.AlertParams; @@ -67,7 +67,6 @@ import android.view.ViewConfiguration;  import android.view.ViewGroup;  import android.view.WindowManager;  import android.view.WindowManagerGlobal; -import android.view.WindowManagerInternal;  import android.view.WindowManagerPolicy.WindowManagerFuncs;  import android.view.accessibility.AccessibilityEvent;  import android.widget.AdapterView; diff --git a/policy/src/com/android/internal/policy/impl/GlobalKeyManager.java b/services/core/java/com/android/server/policy/GlobalKeyManager.java index fc657937eb57..e08c004866ea 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalKeyManager.java +++ b/services/core/java/com/android/server/policy/GlobalKeyManager.java @@ -13,7 +13,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.content.ComponentName;  import android.content.Context; diff --git a/policy/src/com/android/internal/policy/impl/IconUtilities.java b/services/core/java/com/android/server/policy/IconUtilities.java index 82f26adf3567..4658344e0c7e 100644 --- a/policy/src/com/android/internal/policy/impl/IconUtilities.java +++ b/services/core/java/com/android/server/policy/IconUtilities.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.graphics.drawable.BitmapDrawable;  import android.graphics.drawable.Drawable; diff --git a/policy/src/com/android/internal/policy/impl/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index 8fc4647da5f4..e511346838e2 100644 --- a/policy/src/com/android/internal/policy/impl/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -14,12 +14,11 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.animation.ArgbEvaluator;  import android.animation.ValueAnimator;  import android.app.ActivityManager; -import android.app.ActivityManagerNative;  import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent; @@ -28,7 +27,6 @@ import android.graphics.PixelFormat;  import android.graphics.drawable.ColorDrawable;  import android.os.Handler;  import android.os.Message; -import android.os.RemoteException;  import android.os.UserHandle;  import android.provider.Settings;  import android.util.DisplayMetrics; diff --git a/policy/src/com/android/internal/policy/impl/LogDecelerateInterpolator.java b/services/core/java/com/android/server/policy/LogDecelerateInterpolator.java index 1f3e1defba7b..ed5dc6fa7a51 100644 --- a/policy/src/com/android/internal/policy/impl/LogDecelerateInterpolator.java +++ b/services/core/java/com/android/server/policy/LogDecelerateInterpolator.java @@ -14,7 +14,7 @@   * limitations under the License   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.view.animation.Interpolator; diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index dca7db173045..ec8a77513c00 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -13,7 +13,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.app.ActivityManager;  import android.app.ActivityManagerNative; @@ -43,7 +43,7 @@ import android.graphics.PixelFormat;  import android.graphics.Rect;  import android.media.AudioAttributes;  import android.media.AudioManager; -import android.media.AudioService; +import android.media.AudioSystem;  import android.media.IAudioService;  import android.media.Ringtone;  import android.media.RingtoneManager; @@ -89,6 +89,7 @@ import android.view.KeyCharacterMap;  import android.view.KeyCharacterMap.FallbackAction;  import android.view.KeyEvent;  import android.view.MotionEvent; +import android.view.PhoneWindow;  import android.view.Surface;  import android.view.View;  import android.view.ViewConfiguration; @@ -104,12 +105,11 @@ import android.view.animation.AnimationSet;  import android.view.animation.AnimationUtils;  import com.android.internal.R; -import com.android.internal.policy.PolicyManager; -import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate; -import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate.ShowListener;  import com.android.internal.statusbar.IStatusBarService;  import com.android.internal.widget.PointerLocationView;  import com.android.server.LocalServices; +import com.android.server.policy.keyguard.KeyguardServiceDelegate; +import com.android.server.policy.keyguard.KeyguardServiceDelegate.ShowListener;  import java.io.File;  import java.io.FileReader; @@ -1269,7 +1269,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {          mTriplePressOnPowerBehavior = mContext.getResources().getInteger(                  com.android.internal.R.integer.config_triplePressOnPowerBehavior); -        mUseTvRouting = AudioService.getPlatformType(mContext) == AudioService.PLATFORM_TELEVISION; +        mUseTvRouting = AudioSystem.getPlatformType(mContext) == AudioSystem.PLATFORM_TELEVISION;          mUseMasterVolume = mContext.getResources().getBoolean(                  com.android.internal.R.bool.config_useMasterVolume); @@ -2041,7 +2041,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {                  }              } -            Window win = PolicyManager.makeNewWindow(context); +            Window win = new PhoneWindow(context);              final TypedArray ta = win.getWindowStyle();              if (ta.getBoolean(                          com.android.internal.R.styleable.Window_windowDisablePreview, false) @@ -5334,20 +5334,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {      }      void sendCloseSystemWindows() { -        sendCloseSystemWindows(mContext, null); +        PhoneWindow.sendCloseSystemWindows(mContext, null);      }      void sendCloseSystemWindows(String reason) { -        sendCloseSystemWindows(mContext, reason); -    } - -    static void sendCloseSystemWindows(Context context, String reason) { -        if (ActivityManagerNative.isSystemReady()) { -            try { -                ActivityManagerNative.getDefault().closeSystemDialogs(reason); -            } catch (RemoteException e) { -            } -        } +        PhoneWindow.sendCloseSystemWindows(mContext, reason);      }      @Override diff --git a/policy/src/com/android/internal/policy/impl/PolicyControl.java b/services/core/java/com/android/server/policy/PolicyControl.java index 9abd906719ed..dbafc424b7fd 100644 --- a/policy/src/com/android/internal/policy/impl/PolicyControl.java +++ b/services/core/java/com/android/server/policy/PolicyControl.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.app.ActivityManager;  import android.content.Context; diff --git a/policy/src/com/android/internal/policy/impl/RecentApplicationsBackground.java b/services/core/java/com/android/server/policy/RecentApplicationsBackground.java index 3490bd466db0..694a110beaf3 100644 --- a/policy/src/com/android/internal/policy/impl/RecentApplicationsBackground.java +++ b/services/core/java/com/android/server/policy/RecentApplicationsBackground.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.content.Context;  import android.graphics.Canvas; diff --git a/policy/src/com/android/internal/policy/impl/ShortcutManager.java b/services/core/java/com/android/server/policy/ShortcutManager.java index bb898f72673d..6a0136a1b67b 100644 --- a/policy/src/com/android/internal/policy/impl/ShortcutManager.java +++ b/services/core/java/com/android/server/policy/ShortcutManager.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.content.Context;  import android.content.Intent; diff --git a/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/policy/SystemGesturesPointerEventListener.java index 4ff931570797..cfa631fb6f39 100644 --- a/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/policy/SystemGesturesPointerEventListener.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.content.Context;  import android.util.Slog; diff --git a/policy/src/com/android/internal/policy/impl/WakeGestureListener.java b/services/core/java/com/android/server/policy/WakeGestureListener.java index 9396c2ca6260..1d5d7baa98ff 100644 --- a/policy/src/com/android/internal/policy/impl/WakeGestureListener.java +++ b/services/core/java/com/android/server/policy/WakeGestureListener.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.os.Handler;  import android.content.Context; diff --git a/policy/src/com/android/internal/policy/impl/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 2f60d5592c43..0118127b1291 100644 --- a/policy/src/com/android/internal/policy/impl/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl; +package com.android.server.policy;  import android.content.Context;  import android.hardware.Sensor; @@ -25,7 +25,6 @@ import android.os.Handler;  import android.os.SystemProperties;  import android.util.Log;  import android.util.Slog; -import android.util.TimeUtils;  import java.io.PrintWriter; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 6e8f5502a2d2..c3fc195c2e3f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -1,4 +1,4 @@ -package com.android.internal.policy.impl.keyguard; +package com.android.server.policy.keyguard;  import android.content.ComponentName;  import android.content.Context; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index b3b76845c730..2dc685b0633d 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl.keyguard; +package com.android.server.policy.keyguard;  import android.content.Context;  import android.os.Bundle; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java index 6f9c617ebe25..926090e12380 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStateMonitor.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java @@ -14,7 +14,7 @@   * limitations under the License.   */ -package com.android.internal.policy.impl.keyguard; +package com.android.server.policy.keyguard;  import android.app.ActivityManager;  import android.content.Context; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 1c9dfe0ca596..c677e2c5d9b6 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -185,6 +185,9 @@ public class TaskStack {                  Math.min((int)(mBounds.height() / density), serviceConfig.screenHeightDp);          mOverrideConfig.smallestScreenWidthDp =                  Math.min(mOverrideConfig.screenWidthDp, mOverrideConfig.screenHeightDp); +        mOverrideConfig.orientation = +                (mOverrideConfig.screenWidthDp <= mOverrideConfig.screenHeightDp) +                        ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;      }      void updateDisplayInfo() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 8214026c5138..71fddfbacc69 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -29,8 +29,6 @@ import android.view.IWindowId;  import android.view.IWindowSessionCallback;  import android.view.WindowContentFrameStats;  import com.android.internal.app.IBatteryStats; -import com.android.internal.policy.PolicyManager; -import com.android.internal.policy.impl.PhoneWindowManager;  import com.android.internal.util.FastPrintWriter;  import com.android.internal.view.IInputContext;  import com.android.internal.view.IInputMethodClient; @@ -45,6 +43,7 @@ import com.android.server.Watchdog;  import com.android.server.am.BatteryStatsService;  import com.android.server.input.InputManagerService;  import com.android.server.power.ShutdownThread; +import com.android.server.policy.PhoneWindowManager;  import android.Manifest;  import android.app.ActivityManagerNative; @@ -338,7 +337,7 @@ public class WindowManagerService extends IWindowManager.Stub      final boolean mLimitedAlphaCompositing; -    final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); +    final WindowManagerPolicy mPolicy = new PhoneWindowManager();      final IActivityManager mActivityManager; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index bb9530575d4b..e88dacecc509 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -232,7 +232,8 @@ final class WindowState implements WindowManagerPolicy.WindowState {      final Rect mParentFrame = new Rect(); -    // The entire screen area of the device. +    // The entire screen area of the {@link TaskStack} this window is in. Usually equal to the +    // screen area of the device.      final Rect mDisplayFrame = new Rect();      // The region of the display frame that the display type supports displaying content on. This @@ -509,12 +510,12 @@ final class WindowState implements WindowManagerPolicy.WindowState {              if (stack.mUnderStatusBar) {                  mContainingFrame.top = pf.top;              } +            mDisplayFrame.set(mContainingFrame);          } else {              mContainingFrame.set(pf); +            mDisplayFrame.set(df);          } -        mDisplayFrame.set(df); -          final int pw = mContainingFrame.width();          final int ph = mContainingFrame.height(); @@ -572,9 +573,6 @@ final class WindowState implements WindowManagerPolicy.WindowState {          final int fw = mFrame.width();          final int fh = mFrame.height(); -        //System.out.println("In: w=" + w + " h=" + h + " container=" + -        //                   container + " x=" + mAttrs.x + " y=" + mAttrs.y); -          float x, y;          if (mEnforceSizeCompat) {              x = mAttrs.x * mGlobalScale; @@ -591,8 +589,8 @@ final class WindowState implements WindowManagerPolicy.WindowState {                  (int) (x + mAttrs.horizontalMargin * pw),                  (int) (y + mAttrs.verticalMargin * ph), mFrame); -        // Now make sure the window fits in the overall display. -        Gravity.applyDisplay(mAttrs.gravity, df, mFrame); +        // Now make sure the window fits in the overall display frame. +        Gravity.applyDisplay(mAttrs.gravity, mDisplayFrame, mFrame);          // Make sure the content and visible frames are inside of the          // final window frame. diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 7f9af3103cee..875d39561065 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -29,7 +29,6 @@ import android.content.Intent;  import android.content.pm.IPackageManager;  import android.content.pm.PackageManager;  import android.content.res.Configuration; -import android.media.AudioService;  import android.media.tv.TvInputManager;  import android.os.Build;  import android.os.Environment; @@ -60,6 +59,7 @@ import com.android.server.accessibility.AccessibilityManagerService;  import com.android.server.accounts.AccountManagerService;  import com.android.server.am.ActivityManagerService;  import com.android.server.am.BatteryStatsService; +import com.android.server.audio.AudioService;  import com.android.server.clipboard.ClipboardService;  import com.android.server.content.ContentService;  import com.android.server.devicepolicy.DevicePolicyManagerService; diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java index 9d13d3c1e348..c6f6b850f190 100644 --- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java +++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java @@ -24,7 +24,6 @@ import android.content.res.Resources;  import android.hardware.usb.UsbConstants;  import android.hardware.usb.UsbDevice;  import android.hardware.usb.UsbInterface; -import android.media.AudioService;  import android.media.AudioSystem;  import android.media.IAudioService;  import android.midi.MidiDeviceInfo; @@ -38,6 +37,8 @@ import android.os.UserHandle;  import android.provider.Settings;  import android.util.Slog; +import com.android.server.audio.AudioService; +  import libcore.io.IoUtils;  import java.io.File; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index ba5a679ebb40..94691c088dd3 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3665,12 +3665,12 @@ public class TelephonyManager {      /** @hide */      @SystemApi      public boolean getDataEnabled(int subId) { -        boolean retVal; +        boolean retVal = false;          try {              retVal = getITelephony().getDataEnabled(subId);          } catch (RemoteException e) {              Log.e(TAG, "Error calling ITelephony#getDataEnabled", e); -            retVal = false; +        } catch (NullPointerException e) {          }          Log.d(TAG, "getDataEnabled: retVal=" + retVal);          return retVal; diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp index 2d351294c515..871e04f7aa9d 100644 --- a/tools/aapt/AaptAssets.cpp +++ b/tools/aapt/AaptAssets.cpp @@ -345,7 +345,8 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta          return ++currentIndex;      } else { -        if ((part.length() == 2 || part.length() == 3) && isAlpha(part)) { +        if ((part.length() == 2 || part.length() == 3) +               && isAlpha(part) && strcmp("car", part.string())) {              setLanguage(part);              if (++currentIndex == size) {                  return size; diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index f4581d04e30a..8a0a39cfb445 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -2531,22 +2531,17 @@ int doSingleCrunch(Bundle* bundle)  int runInDaemonMode(Bundle* bundle) {      std::cout << "Ready" << std::endl; -    for (std::string line; std::getline(std::cin, line);) { -        if (line == "quit") { +    for (std::string cmd; std::getline(std::cin, cmd);) { +        if (cmd == "quit") {              return NO_ERROR; -        } -        std::stringstream ss; -        ss << line; -        std::string s; - -        std::string command, parameterOne, parameterTwo; -        std::getline(ss, command, ' '); -        std::getline(ss, parameterOne, ' '); -        std::getline(ss, parameterTwo, ' '); -        if (command[0] == 's') { -            bundle->setSingleCrunchInputFile(parameterOne.c_str()); -            bundle->setSingleCrunchOutputFile(parameterTwo.c_str()); -            std::cout << "Crunching " << parameterOne << std::endl; +        } else if (cmd == "s") { +            // Two argument crunch +            std::string inputFile, outputFile; +            std::getline(std::cin, inputFile); +            std::getline(std::cin, outputFile); +            bundle->setSingleCrunchInputFile(inputFile.c_str()); +            bundle->setSingleCrunchOutputFile(outputFile.c_str()); +            std::cout << "Crunching " << inputFile << std::endl;              if (doSingleCrunch(bundle) != NO_ERROR) {                  std::cout << "Error" << std::endl;              } diff --git a/tools/aapt/tests/AaptConfig_test.cpp b/tools/aapt/tests/AaptConfig_test.cpp index e795d81836bd..ef3860c72921 100644 --- a/tools/aapt/tests/AaptConfig_test.cpp +++ b/tools/aapt/tests/AaptConfig_test.cpp @@ -76,3 +76,9 @@ TEST(AaptConfigTest, ParseQualifierAddedInApi13) {      EXPECT_TRUE(TestParse("sw600dp-v8", &config));      EXPECT_EQ(String8("sw600dp-v13"), config.toString());  } + +TEST(AaptConfigTest, TestParsingOfCarAttribute) { +    ConfigDescription config; +    EXPECT_TRUE(TestParse("car", &config)); +    EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode); +} diff --git a/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java b/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java deleted file mode 100644 index 0100dc591039..000000000000 --- a/tools/layoutlib/bridge/src/com/android/internal/policy/PolicyManager.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.policy; - -import com.android.ide.common.rendering.api.LayoutLog; -import com.android.layoutlib.bridge.Bridge; -import com.android.layoutlib.bridge.impl.RenderAction; - -import android.content.Context; -import android.view.BridgeInflater; -import android.view.FallbackEventHandler; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.Window; -import android.view.WindowManagerPolicy; - -/** - * Custom implementation of PolicyManager that does nothing to run in LayoutLib. - * - */ -public class PolicyManager { - -    public static Window makeNewWindow(Context context) { -        // this will likely crash somewhere beyond so we log it. -        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, -                "Call to PolicyManager.makeNewWindow is not supported", null); -        return null; -    } - -    public static LayoutInflater makeNewLayoutInflater(Context context) { -        return new BridgeInflater(context, RenderAction.getCurrentContext().getProjectCallback()); -    } - -    public static WindowManagerPolicy makeNewWindowManager() { -        // this will likely crash somewhere beyond so we log it. -        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, -                "Call to PolicyManager.makeNewWindowManager is not supported", null); -        return null; -    } - -    public static FallbackEventHandler makeNewFallbackEventHandler(Context context) { -        return new FallbackEventHandler() { -            @Override -            public void setView(View v) { -            } - -            @Override -            public void preDispatchKeyEvent(KeyEvent event) { -            } - -            @Override -            public boolean dispatchKeyEvent(KeyEvent event) { -                return false; -            } -        }; -    } -} diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index 8f50c5d4218b..f5e8292c2381 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -254,7 +254,6 @@ public final class CreateInfo implements ICreateInfo {              "android.view.SurfaceView",                        "android.view._Original_SurfaceView",              "android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager",              "android.webkit.WebView",                          "android.webkit._Original_WebView", -            "com.android.internal.policy.PolicyManager",       "com.android.internal.policy._Original_PolicyManager",          };      /**  |