diff options
361 files changed, 4029 insertions, 1284 deletions
diff --git a/Android.mk b/Android.mk index 49dc6af164d6..0957faeba4b3 100644 --- a/Android.mk +++ b/Android.mk @@ -523,6 +523,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \ -since $(SRC_API_DIR)/16.txt 16 \ -since $(SRC_API_DIR)/17.txt 17 \ -since $(SRC_API_DIR)/18.txt 18 \ + -since $(SRC_API_DIR)/19.txt 19 \ -werror -hide 113 \ -overview $(LOCAL_PATH)/core/java/overview.html @@ -652,7 +653,7 @@ web_docs_sample_code_flags := \ ## SDK version identifiers used in the published docs # major[.minor] version for current SDK. (full releases only) -framework_docs_SDK_VERSION:=4.3 +framework_docs_SDK_VERSION:=4.4 # release version (ie "Release x") (full releases only) framework_docs_SDK_REL_ID:=1 diff --git a/api/current.txt b/api/current.txt index 81aec5ea0a6a..9251d394408e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1226,6 +1226,8 @@ package android { field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c field public static final int windowTitleSize = 16842842; // 0x101005a field public static final int windowTitleStyle = 16842843; // 0x101005b + field public static final int windowTranslucentNavigation = 16843760; // 0x10103f0 + field public static final int windowTranslucentStatus = 16843759; // 0x10103ef field public static final int writePermission = 16842760; // 0x1010008 field public static final int x = 16842924; // 0x10100ac field public static final int xlargeScreens = 16843455; // 0x10102bf @@ -1758,10 +1760,12 @@ package android { field public static final int Theme_DeviceDefault_Light_NoActionBar = 16974124; // 0x103012c field public static final int Theme_DeviceDefault_Light_NoActionBar_Fullscreen = 16974125; // 0x103012d field public static final int Theme_DeviceDefault_Light_NoActionBar_Overscan = 16974304; // 0x10301e0 + field public static final int Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor = 16974308; // 0x10301e4 field public static final int Theme_DeviceDefault_Light_Panel = 16974139; // 0x103013b field public static final int Theme_DeviceDefault_NoActionBar = 16974121; // 0x1030129 field public static final int Theme_DeviceDefault_NoActionBar_Fullscreen = 16974122; // 0x103012a field public static final int Theme_DeviceDefault_NoActionBar_Overscan = 16974303; // 0x10301df + field public static final int Theme_DeviceDefault_NoActionBar_TranslucentDecor = 16974307; // 0x10301e3 field public static final int Theme_DeviceDefault_Panel = 16974138; // 0x103013a field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d @@ -1785,10 +1789,12 @@ package android { field public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0 field public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1 field public static final int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de + field public static final int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2 field public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c field public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c field public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d field public static final int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd + field public static final int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1 field public static final int Theme_Holo_Panel = 16973947; // 0x103007b field public static final int Theme_Holo_Wallpaper = 16973949; // 0x103007d field public static final int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e @@ -7249,6 +7255,7 @@ package android.content.pm { method public abstract java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int); method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int); method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int); + method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int); method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int); method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract deprecated void removePackageFromPreferred(java.lang.String); @@ -7277,6 +7284,7 @@ package android.content.pm { field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus"; field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash"; field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front"; + field public static final java.lang.String FEATURE_CONSUMER_IR = "android.hardware.consumerir"; field public static final java.lang.String FEATURE_DEVICE_ADMIN = "android.software.device_admin"; field public static final java.lang.String FEATURE_FAKETOUCH = "android.hardware.faketouch"; field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct"; @@ -7413,6 +7421,7 @@ package android.content.pm { ctor public ProviderInfo(); ctor public ProviderInfo(android.content.pm.ProviderInfo); method public int describeContents(); + method public void dump(android.util.Printer, java.lang.String); field public static final android.os.Parcelable.Creator CREATOR; field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000 field public java.lang.String authority; @@ -7446,6 +7455,7 @@ package android.content.pm { field public java.lang.CharSequence nonLocalizedLabel; field public int preferredOrder; field public int priority; + field public android.content.pm.ProviderInfo providerInfo; field public java.lang.String resolvePackageName; field public android.content.pm.ServiceInfo serviceInfo; field public int specificIndex; @@ -13352,34 +13362,29 @@ package android.media { } public final class RemoteController { - ctor public RemoteController(android.content.Context) throws java.lang.IllegalArgumentException; - ctor public RemoteController(android.content.Context, android.os.Looper) throws java.lang.IllegalArgumentException; - method public int clearArtworkConfiguration(); + ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener) throws java.lang.IllegalArgumentException; + ctor public RemoteController(android.content.Context, android.media.RemoteController.OnClientUpdateListener, android.os.Looper) throws java.lang.IllegalArgumentException; + method public boolean clearArtworkConfiguration(); method public android.media.RemoteController.MetadataEditor editMetadata(); method public long getEstimatedMediaPosition(); - method public int seekTo(long); - method public int sendMediaKeyEvent(android.view.KeyEvent); - method public int setArtworkConfiguration(int, int); - method public void setOnClientUpdateListener(android.media.RemoteController.OnClientUpdateListener); - method public int setSynchronizationMode(int); - field public static final int ERROR = -1; // 0xffffffff - field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe + method public boolean seekTo(long) throws java.lang.IllegalArgumentException; + method public boolean sendMediaKeyEvent(android.view.KeyEvent) throws java.lang.IllegalArgumentException; + method public boolean setArtworkConfiguration(int, int) throws java.lang.IllegalArgumentException; + method public boolean setSynchronizationMode(int) throws java.lang.IllegalArgumentException; field public static final int POSITION_SYNCHRONIZATION_CHECK = 1; // 0x1 field public static final int POSITION_SYNCHRONIZATION_NONE = 0; // 0x0 - field public static final int SUCCESS = 0; // 0x0 } public class RemoteController.MetadataEditor extends android.media.MediaMetadataEditor { method public synchronized void apply(); } - public static abstract class RemoteController.OnClientUpdateListener { - ctor public RemoteController.OnClientUpdateListener(); - method public void onClientChange(boolean); - method public void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor); - method public void onClientPlaybackStateUpdate(int); - method public void onClientPlaybackStateUpdate(int, long, long, float); - method public void onClientTransportControlUpdate(int); + public static abstract interface RemoteController.OnClientUpdateListener { + method public abstract void onClientChange(boolean); + method public abstract void onClientMetadataUpdate(android.media.RemoteController.MetadataEditor); + method public abstract void onClientPlaybackStateUpdate(int); + method public abstract void onClientPlaybackStateUpdate(int, long, long, float); + method public abstract void onClientTransportControlUpdate(int); } public final class ResourceBusyException extends android.media.MediaDrmException { @@ -19302,7 +19307,7 @@ package android.print { field public static final android.print.PrintAttributes.MediaSize OM_PA_KAI; field public static final android.print.PrintAttributes.MediaSize PRC_1; field public static final android.print.PrintAttributes.MediaSize PRC_10; - field public static final android.print.PrintAttributes.MediaSize PRC_16k; + field public static final android.print.PrintAttributes.MediaSize PRC_16K; field public static final android.print.PrintAttributes.MediaSize PRC_2; field public static final android.print.PrintAttributes.MediaSize PRC_3; field public static final android.print.PrintAttributes.MediaSize PRC_4; @@ -19367,12 +19372,6 @@ package android.print { method public android.print.PrintDocumentInfo.Builder setPageCount(int); } - public class PrintFileDocumentAdapter extends android.print.PrintDocumentAdapter { - ctor public PrintFileDocumentAdapter(android.content.Context, java.io.File, android.print.PrintDocumentInfo); - method public void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle); - method public void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback); - } - public final class PrintJob { method public void cancel(); method public android.print.PrintJobId getId(); @@ -19402,10 +19401,8 @@ package android.print { method public android.print.PageRange[] getPages(); method public android.print.PrinterId getPrinterId(); method public int getState(); - method public java.lang.String getTag(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; - field public static final int PRINT_JOB_ID_UNDEFINED = -1; // 0xffffffff field public static final int STATE_BLOCKED = 4; // 0x4 field public static final int STATE_CANCELED = 7; // 0x7 field public static final int STATE_COMPLETED = 5; // 0x5 @@ -19500,6 +19497,7 @@ package android.printservice { method public android.printservice.PrintDocument getDocument(); method public android.print.PrintJobId getId(); method public android.print.PrintJobInfo getInfo(); + method public java.lang.String getTag(); method public boolean isBlocked(); method public boolean isCancelled(); method public boolean isCompleted(); @@ -20987,6 +20985,7 @@ package android.provider { field public static final java.lang.String EXTRA_ERROR = "error"; field public static final java.lang.String EXTRA_INFO = "info"; field public static final java.lang.String EXTRA_LOADING = "loading"; + field public static final java.lang.String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER"; } public static final class DocumentsContract.Document { @@ -24482,6 +24481,7 @@ package android.test.mock { method public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int); method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int); method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int); + method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int); method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int); method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; method public void removePackageFromPreferred(java.lang.String); @@ -28401,8 +28401,6 @@ package android.view { field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200 field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100 field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1 - field public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 8192; // 0x2000 - field public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 4096; // 0x1000 field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0 field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600 field public static final int TEXT_ALIGNMENT_CENTER = 4; // 0x4 @@ -29138,6 +29136,8 @@ package android.view { field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000 field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000 field public static final int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40 + field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000 + field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000 field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000 field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000 field public static final int FORMAT_CHANGED = 8; // 0x8 diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java index 56af7d65eb35..92c6a51e8849 100644 --- a/cmds/media/src/com/android/commands/media/Media.java +++ b/cmds/media/src/com/android/commands/media/Media.java @@ -140,6 +140,11 @@ public class Media extends BaseCommand { } @Override + public void setEnabled(boolean enabled) { + System.out.println("New enable state= " + (enabled ? "enabled" : "disabled")); + } + + @Override public void setPlaybackState(int generationId, int state, long stateChangeTimeMs, long currentPosMs, float speed) { System.out.println("New state: id=" + generationId + " state=" + state diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 55c66726c387..b505d4f8e878 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -585,6 +585,22 @@ final class ApplicationPackageManager extends PackageManager { } @Override + public List<ResolveInfo> queryIntentContentProvidersAsUser( + Intent intent, int flags, int userId) { + try { + return mPM.queryIntentContentProviders(intent, + intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, userId); + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + + @Override + public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) { + return queryIntentContentProvidersAsUser(intent, flags, mContext.getUserId()); + } + + @Override public ProviderInfo resolveContentProvider(String name, int flags) { try { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index acd4ffa1a7fc..267fb2af2dd1 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -123,6 +123,9 @@ interface IPackageManager { List<ResolveInfo> queryIntentServices(in Intent intent, String resolvedType, int flags, int userId); + List<ResolveInfo> queryIntentContentProviders(in Intent intent, + String resolvedType, int flags, int userId); + /** * This implements getInstalledPackages via a "last returned row" * mechanism that is not exposed in the API. This is to get around the IPC diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 9203af94caee..8b8c58b87076 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -915,6 +915,14 @@ public abstract class PackageManager { /** * Feature for {@link #getSystemAvailableFeatures} and + * {@link #hasSystemFeature}: The device is capable of communicating with + * consumer IR devices. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports one or more methods of * reporting current location. */ @@ -2202,6 +2210,24 @@ public abstract class PackageManager { public abstract List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId); + /** {@hide} */ + public abstract List<ResolveInfo> queryIntentContentProvidersAsUser( + Intent intent, int flags, int userId); + + /** + * Retrieve all providers that can match the given intent. + * + * @param intent An intent containing all of the desired specification + * (action, data, type, category, and/or component). + * @param flags Additional option flags. + * @return A List<ResolveInfo> containing one entry for each matching + * ProviderInfo. These are ordered from best to worst match. If + * there are no matching providers, an empty list is returned. + * @see #GET_INTENT_FILTERS + * @see #GET_RESOLVED_FILTER + */ + public abstract List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags); + /** * Find a single content provider by its base path name. * diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index b489ee9e2988..17d13e500e8e 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2819,7 +2819,14 @@ public class PackageParser { continue; } - if (parser.getName().equals("meta-data")) { + if (parser.getName().equals("intent-filter")) { + ProviderIntentInfo intent = new ProviderIntentInfo(outInfo); + if (!parseIntent(res, parser, attrs, true, intent, outError)) { + return false; + } + outInfo.intents.add(intent); + + } else if (parser.getName().equals("meta-data")) { if ((outInfo.metaData=parseMetaData(res, parser, attrs, outInfo.metaData, outError)) == null) { return false; @@ -3982,7 +3989,7 @@ public class PackageParser { return si; } - public final static class Provider extends Component { + public final static class Provider extends Component<ProviderIntentInfo> { public final ProviderInfo info; public boolean syncable; @@ -4116,6 +4123,24 @@ public class PackageParser { } } + public static final class ProviderIntentInfo extends IntentInfo { + public final Provider provider; + + public ProviderIntentInfo(Provider provider) { + this.provider = provider; + } + + public String toString() { + StringBuilder sb = new StringBuilder(128); + sb.append("ProviderIntentInfo{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(' '); + provider.appendComponentShortName(sb); + sb.append('}'); + return sb.toString(); + } + } + /** * @hide */ diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java index a53417620cc0..f6ea058b526f 100644 --- a/core/java/android/content/pm/ProviderInfo.java +++ b/core/java/android/content/pm/ProviderInfo.java @@ -19,6 +19,7 @@ package android.content.pm; import android.os.Parcel; import android.os.Parcelable; import android.os.PatternMatcher; +import android.util.Printer; /** * Holds information about a specific @@ -112,7 +113,13 @@ public final class ProviderInfo extends ComponentInfo flags = orig.flags; isSyncable = orig.isSyncable; } - + + public void dump(Printer pw, String prefix) { + super.dumpFront(pw, prefix); + pw.println(prefix + "authority=" + authority); + pw.println(prefix + "flags=0x" + Integer.toHexString(flags)); + } + public int describeContents() { return 0; } diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index e360e4063f7a..1ff41c022186 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -23,6 +23,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Printer; +import android.util.Slog; import java.text.Collator; import java.util.Comparator; @@ -34,20 +35,30 @@ import java.util.Comparator; * <intent> tags. */ public class ResolveInfo implements Parcelable { + private static final String TAG = "ResolveInfo"; + /** - * The activity or broadcast receiver that corresponds to this resolution match, - * if this resolution is for an activity or broadcast receiver. One and only one of this and - * serviceInfo must be non-null. + * The activity or broadcast receiver that corresponds to this resolution + * match, if this resolution is for an activity or broadcast receiver. + * Exactly one of {@link #activityInfo}, {@link #serviceInfo}, or + * {@link #providerInfo} will be non-null. */ public ActivityInfo activityInfo; /** - * The service that corresponds to this resolution match, if this - * resolution is for a service. One and only one of this and - * activityInfo must be non-null. + * The service that corresponds to this resolution match, if this resolution + * is for a service. Exactly one of {@link #activityInfo}, + * {@link #serviceInfo}, or {@link #providerInfo} will be non-null. */ public ServiceInfo serviceInfo; - + + /** + * The provider that corresponds to this resolution match, if this + * resolution is for a provider. Exactly one of {@link #activityInfo}, + * {@link #serviceInfo}, or {@link #providerInfo} will be non-null. + */ + public ProviderInfo providerInfo; + /** * The IntentFilter that was matched for this ResolveInfo. */ @@ -120,6 +131,13 @@ public class ResolveInfo implements Parcelable { */ public boolean system; + private ComponentInfo getComponentInfo() { + if (activityInfo != null) return activityInfo; + if (serviceInfo != null) return serviceInfo; + if (providerInfo != null) return providerInfo; + throw new IllegalStateException("Missing ComponentInfo!"); + } + /** * Retrieve the current textual label associated with this resolution. This * will call back on the given PackageManager to load the label from @@ -142,7 +160,7 @@ public class ResolveInfo implements Parcelable { return label.toString().trim(); } } - ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; + ComponentInfo ci = getComponentInfo(); ApplicationInfo ai = ci.applicationInfo; if (labelRes != 0) { label = pm.getText(ci.packageName, labelRes, ai); @@ -176,7 +194,7 @@ public class ResolveInfo implements Parcelable { return dr; } } - ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; + ComponentInfo ci = getComponentInfo(); ApplicationInfo ai = ci.applicationInfo; if (icon != 0) { dr = pm.getDrawable(ci.packageName, icon, ai); @@ -196,8 +214,8 @@ public class ResolveInfo implements Parcelable { */ public final int getIconResource() { if (icon != 0) return icon; - if (activityInfo != null) return activityInfo.getIconResource(); - if (serviceInfo != null) return serviceInfo.getIconResource(); + final ComponentInfo ci = getComponentInfo(); + if (ci != null) return ci.getIconResource(); return 0; } @@ -225,6 +243,9 @@ public class ResolveInfo implements Parcelable { } else if (serviceInfo != null) { pw.println(prefix + "ServiceInfo:"); serviceInfo.dump(pw, prefix + " "); + } else if (providerInfo != null) { + pw.println(prefix + "ProviderInfo:"); + providerInfo.dump(pw, prefix + " "); } } @@ -234,6 +255,7 @@ public class ResolveInfo implements Parcelable { public ResolveInfo(ResolveInfo orig) { activityInfo = orig.activityInfo; serviceInfo = orig.serviceInfo; + providerInfo = orig.providerInfo; filter = orig.filter; priority = orig.priority; preferredOrder = orig.preferredOrder; @@ -247,7 +269,7 @@ public class ResolveInfo implements Parcelable { } public String toString() { - ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; + final ComponentInfo ci = getComponentInfo(); StringBuilder sb = new StringBuilder(128); sb.append("ResolveInfo{"); sb.append(Integer.toHexString(System.identityHashCode(this))); @@ -278,6 +300,9 @@ public class ResolveInfo implements Parcelable { } else if (serviceInfo != null) { dest.writeInt(2); serviceInfo.writeToParcel(dest, parcelableFlags); + } else if (providerInfo != null) { + dest.writeInt(3); + providerInfo.writeToParcel(dest, parcelableFlags); } else { dest.writeInt(0); } @@ -309,18 +334,21 @@ public class ResolveInfo implements Parcelable { }; private ResolveInfo(Parcel source) { + activityInfo = null; + serviceInfo = null; + providerInfo = null; switch (source.readInt()) { case 1: activityInfo = ActivityInfo.CREATOR.createFromParcel(source); - serviceInfo = null; break; case 2: serviceInfo = ServiceInfo.CREATOR.createFromParcel(source); - activityInfo = null; + break; + case 3: + providerInfo = ProviderInfo.CREATOR.createFromParcel(source); break; default: - activityInfo = null; - serviceInfo = null; + Slog.w(TAG, "Missing ComponentInfo!"); break; } if (source.readInt() != 0) { diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 85fa7d6885e0..4fe2c4d3669b 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -487,6 +487,12 @@ public final class CameraCharacteristics extends CameraMetadata { * Gain factor from electrons to raw units when * ISO=100 * </p> + * + * <b>Optional</b> - This value may be null on some devices. + * + * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> - + * Present on all devices that report being FULL level hardware devices in the + * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key. */ public static final Key<Rational> SENSOR_BASE_GAIN_FACTOR = new Key<Rational>("android.sensor.baseGainFactor", Rational.class); @@ -502,6 +508,12 @@ public final class CameraCharacteristics extends CameraMetadata { * values above this, it can be a mix of analog and * digital * </p> + * + * <b>Optional</b> - This value may be null on some devices. + * + * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> - + * Present on all devices that report being FULL level hardware devices in the + * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key. */ public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY = new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class); diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index a9a72b074df8..7095e4d498ab 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -197,26 +197,33 @@ public interface CameraDevice extends AutoCloseable { * if the format is user-visible, it must be one of android.scaler.availableFormats; * and the size must be one of android.scaler.available[Processed|Jpeg]Sizes).</p> * - * <p>To change the output, the camera device must be idle. The device is considered - * to be idle once all in-flight and pending capture requests have been processed, - * and all output image buffers from the captures have been sent to their destination - * Surfaces.</p> - * - * <p>To reach an idle state without cancelling any submitted captures, first - * stop any repeating request/burst with {@link #stopRepeating}, and then - * wait for the {@link StateListener#onIdle} callback to be - * called. To idle as fast as possible, use {@link #flush} and wait for the - * idle callback.</p> + * <p>When this method is called with valid Surfaces, the device will transition to the {@link + * StateListener#onBusy busy state}. Once configuration is complete, the device will transition + * into the {@link StateListener#onIdle idle state}. Capture requests using the newly-configured + * Surfaces may then be submitted with {@link #capture}, {@link #captureBurst}, {@link + * #setRepeatingRequest}, or {@link #setRepeatingBurst}.</p> + * + * <p>If this method is called while the camera device is still actively processing previously + * submitted captures, then the following sequence of events occurs: The device transitions to + * the busy state and calls the {@link StateListener#onBusy} callback. Second, if a repeating + * request is set it is cleared. Third, the device finishes up all in-flight and pending + * requests. Finally, once the device is idle, it then reconfigures its outputs, and calls the + * {@link StateListener#onIdle} method once it is again ready to accept capture + * requests. Therefore, no submitted work is discarded. To idle as fast as possible, use {@link + * #flush} and wait for the idle callback before calling configureOutputs. This will discard + * work, but reaches the new configuration sooner.</p> * * <p>Using larger resolution outputs, or more outputs, can result in slower * output rate from the device.</p> * - * <p>Configuring the outputs with an empty or null list will transition - * the camera into an {@link StateListener#onUnconfigured unconfigured state}. - * </p> + * <p>Configuring the outputs with an empty or null list will transition the camera into an + * {@link StateListener#onUnconfigured unconfigured state} instead of the {@link + * StateListener#onIdle idle state}. </p> * * <p>Calling configureOutputs with the same arguments as the last call to - * configureOutputs has no effect.</p> + * configureOutputs has no effect, and the {@link StateListener#onBusy busy} + * and {@link StateListener#onIdle idle} state transitions will happen + * immediately.</p> * * @param outputs The new set of Surfaces that should be made available as * targets for captured image data. @@ -228,7 +235,10 @@ public interface CameraDevice extends AutoCloseable { * @throws IllegalStateException if the camera device is not idle, or * if the camera device has been closed * + * @see StateListener#onBusy * @see StateListener#onIdle + * @see StateListener#onActive + * @see StateListener#onUnconfigured * @see #stopRepeating * @see #flush */ @@ -516,31 +526,6 @@ public interface CameraDevice extends AutoCloseable { public void waitUntilIdle() throws CameraAccessException; /** - * Set the listener object to call when an asynchronous device event occurs, - * such as errors or idle notifications. - * - * <p>The events reported here are device-wide; notifications about - * individual capture requests or capture results are reported through - * {@link CaptureListener}.</p> - * - * <p>If the camera device is idle when the listener is set, then the - * {@link StateListener#onIdle} method will be immediately called, - * even if the device has never been active before. - * </p> - * - * @param listener the CameraDeviceListener to send device-level event - * notifications to. Setting this to null will stop notifications. - * @param handler the handler on which the listener should be invoked, or - * {@code null} to use the current thread's {@link android.os.Looper looper}. - * - * @throws IllegalArgumentException if handler is null, the listener is - * not null, and the calling thread has no looper - * - * @hide - */ - public void setDeviceListener(StateListener listener, Handler handler); - - /** * Flush all captures currently pending and in-progress as fast as * possible. * @@ -577,13 +562,24 @@ public interface CameraDevice extends AutoCloseable { public void flush() throws CameraAccessException; /** - * Close the connection to this camera device. After this call, all calls to + * Close the connection to this camera device. + * + * <p>After this call, all calls to * the camera device interface will throw a {@link IllegalStateException}, - * except for calls to close(). + * except for calls to close(). Once the device has fully shut down, the + * {@link StateListener#onClosed} callback will be called, and the camera is + * free to be re-opened.</p> + * + * <p>After this call, besides the final {@link StateListener#onClosed} call, no calls to the + * device's {@link StateListener} will occur, and any remaining submitted capture requests will + * not fire their {@link CaptureListener} callbacks.</p> + * + * <p>To shut down as fast as possible, call the {@link #flush} method and then {@link #close} + * once the flush completes. This will discard some capture requests, but results in faster + * shutdown.</p> */ @Override public void close(); - // TODO: We should decide on the behavior of in-flight requests should be on close. /** * <p>A listener for tracking the progress of a {@link CaptureRequest} @@ -713,6 +709,9 @@ public interface CameraDevice extends AutoCloseable { * A listener for notifications about the state of a camera * device. * + * <p>A listener must be provided to the {@link CameraManager#openCamera} + * method to open a camera device.</p> + * * <p>These events include notifications about the device becoming idle ( * allowing for {@link #configureOutputs} to be called), about device * disconnection, and about unexpected device errors.</p> @@ -722,7 +721,7 @@ public interface CameraDevice extends AutoCloseable { * the {@link #capture}, {@link #captureBurst}, {@link * #setRepeatingRequest}, or {@link #setRepeatingBurst} methods. * - * @see #setDeviceListener + * @see CameraManager#openCamera */ public static abstract class StateListener { /** diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index f5ee367c70ca..65b6c7a09443 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -197,6 +197,8 @@ public final class CameraManager { * {@link #openCamera}. * * @param cameraId The unique identifier of the camera device to open + * @param listener The listener for the camera. Must not be null. + * @param handler The handler to call the listener on. Must not be null. * * @throws CameraAccessException if the camera is disabled by device policy, * or too many camera devices are already open, or the cameraId does not match @@ -204,11 +206,14 @@ public final class CameraManager { * * @throws SecurityException if the application does not have permission to * access the camera + * @throws IllegalArgumentException if listener or handler is null. * * @see #getCameraIdList * @see android.app.admin.DevicePolicyManager#setCameraDisabled */ - private CameraDevice openCamera(String cameraId) throws CameraAccessException { + private void openCameraDeviceUserAsync(String cameraId, + CameraDevice.StateListener listener, Handler handler) + throws CameraAccessException { try { synchronized (mLock) { @@ -216,7 +221,10 @@ public final class CameraManager { ICameraDeviceUser cameraUser; android.hardware.camera2.impl.CameraDevice device = - new android.hardware.camera2.impl.CameraDevice(cameraId); + new android.hardware.camera2.impl.CameraDevice( + cameraId, + listener, + handler); BinderHolder holder = new BinderHolder(); mCameraService.connectDevice(device.getCallbacks(), @@ -225,10 +233,9 @@ public final class CameraManager { cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); // TODO: factor out listener to be non-nested, then move setter to constructor + // For now, calling setRemoteDevice will fire initial + // onOpened/onUnconfigured callbacks. device.setRemoteDevice(cameraUser); - - return device; - } } catch (NumberFormatException e) { @@ -238,7 +245,6 @@ public final class CameraManager { throw e.asChecked(); } catch (RemoteException e) { // impossible - return null; } } @@ -303,16 +309,7 @@ public final class CameraManager { } } - final CameraDevice camera = openCamera(cameraId); - camera.setDeviceListener(listener, handler); - - // TODO: make truly async in the camera service - handler.post(new Runnable() { - @Override - public void run() { - listener.onOpened(camera); - } - }); + openCameraDeviceUserAsync(cameraId, listener, handler); } /** diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index c9626f1b074e..dbd0457e525f 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -60,11 +60,6 @@ public final class CaptureResult extends CameraMetadata { @Override public <T> T get(Key<T> key) { - if (key == STATISTICS_FACES) { // Don't throw IllegalArgumentException - // TODO: Implement android.statistics.faces - return null; - } - return mResults.get(key); } @@ -727,6 +722,12 @@ public final class CaptureResult extends CameraMetadata { * The thermal diode being queried should be inside the sensor PCB, or * somewhere close to it. * </p> + * + * <b>Optional</b> - This value may be null on some devices. + * + * <b>{@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL}</b> - + * Present on all devices that report being FULL level hardware devices in the + * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL HARDWARE_LEVEL} key. */ public static final Key<Float> SENSOR_TEMPERATURE = new Key<Float>("android.sensor.temperature", float.class); diff --git a/core/java/android/hardware/camera2/Face.java b/core/java/android/hardware/camera2/Face.java index ef068ca7ec61..ded8839dc15c 100644 --- a/core/java/android/hardware/camera2/Face.java +++ b/core/java/android/hardware/camera2/Face.java @@ -58,6 +58,9 @@ public final class Face { * Create a new face with all fields set. * * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional. + * They are only required when the {@link CaptureResult} reports that the value of key + * {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} is + * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_FULL}. * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, * rightEyePosition, and mouthPosition may be independently null or not-null.</p> @@ -107,7 +110,11 @@ public final class Face { * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional. * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, - * rightEyePosition, and mouthPosition may be independently null or not-null.</p> + * rightEyePosition, and mouthPosition may be independently null or not-null. When devices + * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as + * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult}, + * the face id of each face is expected to be {@value #ID_UNSUPPORTED}, the leftEyePosition, + * rightEyePosition, and mouthPositions are expected to be {@code null} for each face.</p> * * @param bounds Bounds of the face. * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}. @@ -168,7 +175,10 @@ public final class Face { * <p>This is an optional field, may not be supported on all devices. * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, - * rightEyePosition, and mouthPosition may be independently null or not-null.</p> + * rightEyePosition, and mouthPosition may be independently null or not-null. When devices + * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as + * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult}, + * the face id of each face is expected to be {@value #ID_UNSUPPORTED}.</p> * * <p>This value will either be {@value #ID_UNSUPPORTED} or * otherwise greater than {@code 0}.</p> @@ -219,7 +229,7 @@ public final class Face { * field, may not be supported on all devices. If not * supported, the value will always be set to null. * This value will always be null only if {@link #getId()} returns - * {@value #ID_UNSUPPORTED}.</p> them are. + * {@value #ID_UNSUPPORTED}.</p> * </p> * * @return The mouth position, or {@code null} if unknown. diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java index 463063c1fb2a..c5d099921306 100644 --- a/core/java/android/hardware/camera2/impl/CameraDevice.java +++ b/core/java/android/hardware/camera2/impl/CameraDevice.java @@ -55,8 +55,10 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { private final Object mLock = new Object(); private final CameraDeviceCallbacks mCallbacks = new CameraDeviceCallbacks(); - private StateListener mDeviceListener; - private Handler mDeviceHandler; + private final StateListener mDeviceListener; + private final Handler mDeviceHandler; + + private boolean mIdle = true; private final SparseArray<CaptureListenerHolder> mCaptureListenerMap = new SparseArray<CaptureListenerHolder>(); @@ -67,8 +69,72 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { private final String mCameraId; - public CameraDevice(String cameraId) { + // Runnables for all state transitions, except error, which needs the + // error code argument + + private final Runnable mCallOnOpened = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onOpened(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnUnconfigured = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onUnconfigured(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnActive = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onActive(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnBusy = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onBusy(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnClosed = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onClosed(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnIdle = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onIdle(CameraDevice.this); + } + } + }; + + private final Runnable mCallOnDisconnected = new Runnable() { + public void run() { + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onDisconnected(CameraDevice.this); + } + } + }; + + public CameraDevice(String cameraId, StateListener listener, Handler handler) { + if (cameraId == null || listener == null || handler == null) { + throw new IllegalArgumentException("Null argument given"); + } mCameraId = cameraId; + mDeviceListener = listener; + mDeviceHandler = handler; TAG = String.format("CameraDevice-%s-JV", mCameraId); DEBUG = Log.isLoggable(TAG, Log.DEBUG); } @@ -79,7 +145,12 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { public void setRemoteDevice(ICameraDeviceUser remoteDevice) { // TODO: Move from decorator to direct binder-mediated exceptions - mRemoteDevice = CameraBinderDecorator.newInstance(remoteDevice); + synchronized(mLock) { + mRemoteDevice = CameraBinderDecorator.newInstance(remoteDevice); + + mDeviceHandler.post(mCallOnOpened); + mDeviceHandler.post(mCallOnUnconfigured); + } } @Override @@ -89,7 +160,13 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { @Override public void configureOutputs(List<Surface> outputs) throws CameraAccessException { + // Treat a null input the same an empty list + if (outputs == null) { + outputs = new ArrayList<Surface>(); + } synchronized (mLock) { + checkIfCameraClosed(); + HashSet<Surface> addSet = new HashSet<Surface>(outputs); // Streams to create List<Integer> deleteList = new ArrayList<Integer>(); // Streams to delete @@ -105,9 +182,13 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { } } + mDeviceHandler.post(mCallOnBusy); + stopRepeating(); + try { - // TODO: mRemoteDevice.beginConfigure + mRemoteDevice.waitUntilIdle(); + // TODO: mRemoteDevice.beginConfigure // Delete all streams first (to free up HW resources) for (Integer streamId : deleteList) { mRemoteDevice.deleteStream(streamId); @@ -126,7 +207,7 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { } catch (CameraRuntimeException e) { if (e.getReason() == CAMERA_IN_USE) { throw new IllegalStateException("The camera is currently busy." + - " You must call waitUntilIdle before trying to reconfigure."); + " You must wait until the previous operation completes."); } throw e.asChecked(); @@ -134,6 +215,12 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { // impossible return; } + + if (outputs.size() > 0) { + mDeviceHandler.post(mCallOnIdle); + } else { + mDeviceHandler.post(mCallOnUnconfigured); + } } } @@ -141,6 +228,7 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { public CaptureRequest.Builder createCaptureRequest(int templateType) throws CameraAccessException { synchronized (mLock) { + checkIfCameraClosed(); CameraMetadataNative templatedRequest = new CameraMetadataNative(); @@ -188,7 +276,7 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { } synchronized (mLock) { - + checkIfCameraClosed(); int requestId; try { @@ -208,6 +296,11 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { mRepeatingRequestIdStack.add(requestId); } + if (mIdle) { + mDeviceHandler.post(mCallOnActive); + } + mIdle = false; + return requestId; } } @@ -233,7 +326,7 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { public void stopRepeating() throws CameraAccessException { synchronized (mLock) { - + checkIfCameraClosed(); while (!mRepeatingRequestIdStack.isEmpty()) { int requestId = mRepeatingRequestIdStack.pop(); @@ -270,20 +363,11 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { } @Override - public void setDeviceListener(StateListener listener, Handler handler) { - synchronized (mLock) { - if (listener != null) { - handler = checkHandler(handler); - } - - mDeviceListener = listener; - mDeviceHandler = handler; - } - } - - @Override public void flush() throws CameraAccessException { synchronized (mLock) { + checkIfCameraClosed(); + + mDeviceHandler.post(mCallOnBusy); try { mRemoteDevice.flush(); } catch (CameraRuntimeException e) { @@ -297,9 +381,6 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { @Override public void close() { - - // TODO: every method should throw IllegalStateException after close has been called - synchronized (mLock) { try { @@ -312,8 +393,11 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { // impossible } - mRemoteDevice = null; + if (mRemoteDevice != null) { + mDeviceHandler.post(mCallOnClosed); + } + mRemoteDevice = null; } } @@ -399,49 +483,44 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { @Override public void onCameraError(final int errorCode) { - synchronized (mLock) { - if (CameraDevice.this.mDeviceListener == null) return; - final StateListener listener = CameraDevice.this.mDeviceListener; - Runnable r = null; + Runnable r = null; + if (isClosed()) return; + + synchronized(mLock) { switch (errorCode) { case ERROR_CAMERA_DISCONNECTED: - r = new Runnable() { - public void run() { - listener.onDisconnected(CameraDevice.this); - } - }; + r = mCallOnDisconnected; break; + default: + Log.e(TAG, "Unknown error from camera device: " + errorCode); + // no break case ERROR_CAMERA_DEVICE: case ERROR_CAMERA_SERVICE: r = new Runnable() { public void run() { - listener.onError(CameraDevice.this, errorCode); + if (!CameraDevice.this.isClosed()) { + mDeviceListener.onError(CameraDevice.this, errorCode); + } } }; break; - default: - Log.e(TAG, "Unknown error from camera device: " + errorCode); - } - if (r != null) { - CameraDevice.this.mDeviceHandler.post(r); } + CameraDevice.this.mDeviceHandler.post(r); } } @Override public void onCameraIdle() { + if (isClosed()) return; + if (DEBUG) { Log.d(TAG, "Camera now idle"); } synchronized (mLock) { - if (CameraDevice.this.mDeviceListener == null) return; - final StateListener listener = CameraDevice.this.mDeviceListener; - Runnable r = new Runnable() { - public void run() { - listener.onIdle(CameraDevice.this); - } - }; - CameraDevice.this.mDeviceHandler.post(r); + if (!CameraDevice.this.mIdle) { + CameraDevice.this.mDeviceHandler.post(mCallOnIdle); + } + CameraDevice.this.mIdle = true; } } @@ -461,14 +540,18 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { return; } + if (isClosed()) return; + // Dispatch capture start notice holder.getHandler().post( new Runnable() { public void run() { - holder.getListener().onCaptureStarted( - CameraDevice.this, - holder.getRequest(), - timestamp); + if (!CameraDevice.this.isClosed()) { + holder.getListener().onCaptureStarted( + CameraDevice.this, + holder.getRequest(), + timestamp); + } } }); } @@ -503,6 +586,8 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { return; } + if (isClosed()) return; + final CaptureRequest request = holder.getRequest(); final CaptureResult resultAsCapture = new CaptureResult(result, request, requestId); @@ -510,10 +595,12 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { new Runnable() { @Override public void run() { - holder.getListener().onCaptureCompleted( - CameraDevice.this, - request, - resultAsCapture); + if (!CameraDevice.this.isClosed()){ + holder.getListener().onCaptureCompleted( + CameraDevice.this, + request, + resultAsCapture); + } } }); } @@ -541,4 +628,10 @@ public class CameraDevice implements android.hardware.camera2.CameraDevice { throw new IllegalStateException("CameraDevice was already closed"); } } + + private boolean isClosed() { + synchronized(mLock) { + return (mRemoteDevice == null); + } + } } diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 6d04bf8a933f..adccbc57c5c7 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -16,7 +16,13 @@ package android.hardware.camera2.impl; +import android.graphics.ImageFormat; +import android.graphics.Point; +import android.graphics.Rect; +import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.Face; import android.hardware.camera2.Rational; import android.os.Parcelable; import android.os.Parcel; @@ -35,6 +41,9 @@ import java.util.HashMap; public class CameraMetadataNative extends CameraMetadata implements Parcelable { private static final String TAG = "CameraMetadataJV"; + private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); + // this should be in sync with HAL_PIXEL_FORMAT_BLOB defined in graphics.h + private static final int NATIVE_JPEG_FORMAT = 0x21; public CameraMetadataNative() { super(); @@ -83,16 +92,21 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { @SuppressWarnings("unchecked") @Override public <T> T get(Key<T> key) { - int tag = key.getTag(); - byte[] values = readValues(tag); - if (values == null) { + + if (key == CaptureResult.STATISTICS_FACES) { + /** + * FIXME: Workaround for HAL bug that's missing FACE_DETECT_MODE + */ + Log.w(TAG, "Expected non-null android.statistics.faceDetectMode"); return null; } - int nativeType = getNativeType(tag); + T value = getOverride(key); + if (value != null) { + return value; + } - ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); - return unpackSingle(buffer, key.getType(), nativeType); + return getBase(key); } public void readFromParcel(Parcel in) { @@ -109,24 +123,11 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { * type to the key. */ public <T> void set(Key<T> key, T value) { - int tag = key.getTag(); - - if (value == null) { - writeValues(tag, null); + if (setOverride(key, value)) { return; } - int nativeType = getNativeType(tag); - - int size = packSingle(value, null, key.getType(), nativeType, /* sizeOnly */true); - - // TODO: Optimization. Cache the byte[] and reuse if the size is big enough. - byte[] values = new byte[size]; - - ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); - packSingle(value, buffer, key.getType(), nativeType, /*sizeOnly*/false); - - writeValues(tag, values); + setBase(key, value); } // Keep up-to-date with camera_metadata.h @@ -400,11 +401,13 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { int remaining = buffer.remaining(); int arraySize = remaining / elementSize; - Log.v(TAG, - String.format( + if (VERBOSE) { + Log.v(TAG, + String.format( "Attempting to unpack array (count = %d, element size = %d, bytes " + - "remaining = %d) for type %s", + "remaining = %d) for type %s", arraySize, elementSize, remaining, type)); + } array = Array.newInstance(componentType, arraySize); for (int i = 0; i < arraySize; ++i) { @@ -432,6 +435,157 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { return (T) array; } + private <T> T getBase(Key<T> key) { + int tag = key.getTag(); + byte[] values = readValues(tag); + if (values == null) { + return null; + } + + int nativeType = getNativeType(tag); + + ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); + return unpackSingle(buffer, key.getType(), nativeType); + } + + // Need overwrite some metadata that has different definitions between native + // and managed sides. + @SuppressWarnings("unchecked") + private <T> T getOverride(Key<T> key) { + if (key == CameraCharacteristics.SCALER_AVAILABLE_FORMATS) { + return (T) getAvailableFormats(); + } else if (key == CaptureResult.STATISTICS_FACES) { + return (T) getFaces(); + } + + // For other keys, get() falls back to getBase() + return null; + } + + private int[] getAvailableFormats() { + int[] availableFormats = getBase(CameraCharacteristics.SCALER_AVAILABLE_FORMATS); + for (int i = 0; i < availableFormats.length; i++) { + // JPEG has different value between native and managed side, need override. + if (availableFormats[i] == NATIVE_JPEG_FORMAT) { + availableFormats[i] = ImageFormat.JPEG; + } + } + return availableFormats; + } + + private Face[] getFaces() { + final int FACE_LANDMARK_SIZE = 6; + + Integer faceDetectMode = getBase(CaptureResult.STATISTICS_FACE_DETECT_MODE); + if (faceDetectMode == null) { + throw new AssertionError("Expect non-null face detect mode"); + } + + if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_OFF) { + return new Face[0]; + } + if (faceDetectMode != CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE && + faceDetectMode != CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL) { + throw new AssertionError("Unknown face detect mode: " + faceDetectMode); + } + + // Face scores and rectangles are required by SIMPLE and FULL mode. + byte[] faceScores = getBase(CaptureResult.STATISTICS_FACE_SCORES); + Rect[] faceRectangles = getBase(CaptureResult.STATISTICS_FACE_RECTANGLES); + if (faceScores == null || faceRectangles == null) { + throw new AssertionError("Expect face scores and rectangles to be non-null"); + } else if (faceScores.length != faceRectangles.length) { + throw new AssertionError( + String.format("Face score size(%d) doesn match face rectangle size(%d)!", + faceScores.length, faceRectangles.length)); + } + + // Face id and landmarks are only required by FULL mode. + int[] faceIds = getBase(CaptureResult.STATISTICS_FACE_IDS); + int[] faceLandmarks = getBase(CaptureResult.STATISTICS_FACE_LANDMARKS); + int numFaces = faceScores.length; + if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL) { + if (faceIds == null || faceLandmarks == null) { + throw new AssertionError("Expect face ids and landmarks to be non-null for " + + "FULL mode"); + } else if (faceIds.length != numFaces || + faceLandmarks.length != numFaces * FACE_LANDMARK_SIZE) { + throw new AssertionError( + String.format("Face id size(%d), or face landmark size(%d) don't match " + + "face number(%d)!", + faceIds.length, faceLandmarks.length * FACE_LANDMARK_SIZE, + numFaces)); + } + } + + Face[] faces = new Face[numFaces]; + if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE) { + for (int i = 0; i < numFaces; i++) { + faces[i] = new Face(faceRectangles[i], faceScores[i]); + } + } else { + // CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL + for (int i = 0; i < numFaces; i++) { + Point leftEye = new Point(faceLandmarks[i*6], faceLandmarks[i*6+1]); + Point rightEye = new Point(faceLandmarks[i*6+2], faceLandmarks[i*6+3]); + Point mouth = new Point(faceLandmarks[i*6+4], faceLandmarks[i*6+5]); + faces[i] = new Face(faceRectangles[i], faceScores[i], faceIds[i], + leftEye, rightEye, mouth); + } + } + return faces; + } + + private <T> void setBase(Key<T> key, T value) { + int tag = key.getTag(); + + if (value == null) { + writeValues(tag, null); + return; + } + + int nativeType = getNativeType(tag); + + int size = packSingle(value, null, key.getType(), nativeType, /* sizeOnly */true); + + // TODO: Optimization. Cache the byte[] and reuse if the size is big enough. + byte[] values = new byte[size]; + + ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); + packSingle(value, buffer, key.getType(), nativeType, /*sizeOnly*/false); + + writeValues(tag, values); + } + + // Set the camera metadata override. + private <T> boolean setOverride(Key<T> key, T value) { + if (key == CameraCharacteristics.SCALER_AVAILABLE_FORMATS) { + return setAvailableFormats((int[]) value); + } + + // For other keys, set() falls back to setBase(). + return false; + } + + private boolean setAvailableFormats(int[] value) { + int[] availableFormat = value; + if (value == null) { + // Let setBase() to handle the null value case. + return false; + } + + int[] newValues = new int[availableFormat.length]; + for (int i = 0; i < availableFormat.length; i++) { + newValues[i] = availableFormat[i]; + if (availableFormat[i] == ImageFormat.JPEG) { + newValues[i] = NATIVE_JPEG_FORMAT; + } + } + + setBase(CameraCharacteristics.SCALER_AVAILABLE_FORMATS, newValues); + return true; + } + private long mMetadataPtr; // native CameraMetadata* private native long nativeAllocate(); @@ -535,7 +689,7 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { * @hide */ public byte[] readValues(int tag) { - // TODO: Optimization. Native code returns a ByteBuffer instead. + // TODO: Optimization. Native code returns a ByteBuffer instead. return nativeReadValues(tag); } @@ -565,8 +719,9 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { "Expected values array to be the same size as the enumTypes values " + values.length + " for type " + enumType); } - - Log.v(TAG, "Registered enum values for type " + enumType + " values"); + if (VERBOSE) { + Log.v(TAG, "Registered enum values for type " + enumType + " values"); + } sEnumValues.put(enumType, values); } @@ -654,14 +809,18 @@ public class CameraMetadataNative extends CameraMetadata implements Parcelable { static { nativeClassInit(); - Log.v(TAG, "Shall register metadata marshalers"); + if (VERBOSE) { + Log.v(TAG, "Shall register metadata marshalers"); + } // load built-in marshallers registerMarshaler(new MetadataMarshalRect()); registerMarshaler(new MetadataMarshalSize()); registerMarshaler(new MetadataMarshalString()); - Log.v(TAG, "Registered metadata marshalers"); + if (VERBOSE) { + Log.v(TAG, "Registered metadata marshalers"); + } } } diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java index 959380d93f40..e1a9cb7592e5 100644 --- a/core/java/android/print/PrintAttributes.java +++ b/core/java/android/print/PrintAttributes.java @@ -22,10 +22,13 @@ import android.content.res.Resources.NotFoundException; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import com.android.internal.R; +import java.util.Map; + /** * This class represents the attributes of a print job. */ @@ -267,6 +270,9 @@ public final class PrintAttributes implements Parcelable { public static final class MediaSize { private static final String LOG_TAG = "MediaSize"; + private static final Map<String, MediaSize> sIdToMediaSizeMap = + new ArrayMap<String, MediaSize>(); + /** * Unknown media size in portrait mode. * <p> @@ -276,7 +282,7 @@ public final class PrintAttributes implements Parcelable { */ public static final MediaSize UNKNOWN_PORTRAIT = new MediaSize("UNKNOWN_PORTRAIT", "android", - R.string.mediasize_unknown_portrait, Integer.MAX_VALUE, 1); + R.string.mediasize_unknown_portrait, 1, Integer.MAX_VALUE); /** * Unknown media size in landscape mode. @@ -287,7 +293,7 @@ public final class PrintAttributes implements Parcelable { */ public static final MediaSize UNKNOWN_LANDSCAPE = new MediaSize("UNKNOWN_LANDSCAPE", "android", - R.string.mediasize_unknown_landscape, 1, Integer.MAX_VALUE); + R.string.mediasize_unknown_landscape, Integer.MAX_VALUE, 1); // ISO sizes @@ -494,8 +500,8 @@ public final class PrintAttributes implements Parcelable { R.string.mediasize_chinese_prc_10, 12756, 18032); /** Chinese PRC 16k media size: 146mm x 215mm (5.749" x 8.465") */ - public static final MediaSize PRC_16k = - new MediaSize("PRC_16k", "android", + public static final MediaSize PRC_16K = + new MediaSize("PRC_16K", "android", R.string.mediasize_chinese_prc_16k, 5749, 8465); /** Chinese Pa Kai media size: 267mm x 389mm (10.512" x 15.315") */ public static final MediaSize OM_PA_KAI = @@ -651,6 +657,9 @@ public final class PrintAttributes implements Parcelable { mWidthMils = widthMils; mHeightMils = heightMils; mLabel = null; + + // Build this mapping only for predefined media sizes. + sIdToMediaSizeMap.put(mId, this); } /** @@ -854,6 +863,18 @@ public final class PrintAttributes implements Parcelable { builder.append("}"); return builder.toString(); } + + /** + * Gets a standard media size given its id. + * + * @param id The media size id. + * @return The media size for the given id or null. + * + * @hide + */ + public static MediaSize getStandardMediaSizeById(String id) { + return sIdToMediaSizeMap.get(id); + } } /** diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java index c3a23a53e426..5d655bfe5bc2 100644 --- a/core/java/android/print/PrintFileDocumentAdapter.java +++ b/core/java/android/print/PrintFileDocumentAdapter.java @@ -41,6 +41,8 @@ import java.io.OutputStream; * spooling the data, so you can delete the file if it is a * temporary one. To achieve this one must override {@link #onFinish()} * and delete the file yourself. + * + * @hide */ public class PrintFileDocumentAdapter extends PrintDocumentAdapter { diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java index e5d06a2e534d..ccb4f440df05 100644 --- a/core/java/android/print/PrintJobInfo.java +++ b/core/java/android/print/PrintJobInfo.java @@ -26,9 +26,6 @@ import java.util.Arrays; */ public final class PrintJobInfo implements Parcelable { - /** Undefined print job id. */ - public static final int PRINT_JOB_ID_UNDEFINED = -1; - /** * Constant for matching any print job state. * @@ -356,6 +353,8 @@ public final class PrintJobInfo implements Parcelable { * Gets the optional tag assigned by a print service. * * @return The tag. + * + * @hide */ public String getTag() { return mTag; diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java index 721e31e09da8..d1dbedf9ef63 100644 --- a/core/java/android/printservice/PrintJob.java +++ b/core/java/android/printservice/PrintJob.java @@ -301,6 +301,18 @@ public final class PrintJob { return false; } + /** + * Gets the print job tag. + * + * @return tag The tag or null. + * + * @see #setTag(String) + */ + public String getTag() { + PrintService.throwIfNotCalledOnMainThread(); + return getInfo().getTag(); + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 8bf6e4faf686..1c14c38f840b 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -70,8 +70,14 @@ public final class DocumentsContract { } /** {@hide} */ + @Deprecated public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; + /** + * Intent action used to identify {@link DocumentsProvider} instances. + */ + public static final String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER"; + /** {@hide} */ public static final String ACTION_MANAGE_ROOT = "android.provider.action.MANAGE_ROOT"; /** {@hide} */ @@ -561,7 +567,7 @@ public final class DocumentsContract { final ProviderInfo info = context.getPackageManager() .resolveContentProvider(uri.getAuthority(), PackageManager.GET_META_DATA); - if (info.metaData != null && info.metaData.containsKey( + if (info != null && info.metaData != null && info.metaData.containsKey( DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) { return true; } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 989e2871b797..50777fd34245 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2441,9 +2441,7 @@ public final class Settings { SCREEN_BRIGHTNESS_MODE, SCREEN_AUTO_BRIGHTNESS_ADJ, VIBRATE_INPUT_DEVICES, - MODE_RINGER, // moved to global MODE_RINGER_STREAMS_AFFECTED, - MUTE_STREAMS_AFFECTED, VOLUME_VOICE, VOLUME_SYSTEM, VOLUME_RING, @@ -5940,7 +5938,6 @@ public final class Settings { public static final String[] SETTINGS_TO_BACKUP = { BUGREPORT_IN_POWER_MENU, STAY_ON_WHILE_PLUGGED_IN, - MODE_RINGER, AUTO_TIME, AUTO_TIME_ZONE, POWER_SOUNDS_ENABLED, diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java index 122f8a171d0d..06935ae7a2c9 100644 --- a/core/java/android/text/DynamicLayout.java +++ b/core/java/android/text/DynamicLayout.java @@ -502,17 +502,19 @@ public class DynamicLayout extends Layout } mNumberOfBlocks = newNumberOfBlocks; + int newFirstChangedBlock; final int deltaLines = newLineCount - (endLine - startLine + 1); if (deltaLines != 0) { // Display list whose index is >= mIndexFirstChangedBlock is valid // but it needs to update its drawing location. - mIndexFirstChangedBlock = firstBlock + numAddedBlocks; - for (int i = mIndexFirstChangedBlock; i < mNumberOfBlocks; i++) { + newFirstChangedBlock = firstBlock + numAddedBlocks; + for (int i = newFirstChangedBlock; i < mNumberOfBlocks; i++) { mBlockEndLines[i] += deltaLines; } } else { - mIndexFirstChangedBlock = mNumberOfBlocks; + newFirstChangedBlock = mNumberOfBlocks; } + mIndexFirstChangedBlock = Math.min(mIndexFirstChangedBlock, newFirstChangedBlock); int blockIndex = firstBlock; if (createBlockBefore) { diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java index 6efde05fa429..34274a62ce66 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -1293,23 +1293,29 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable public boolean equals(Object o) { if (o instanceof Spanned && toString().equals(o.toString())) { + Spanned other = (Spanned) o; // Check span data - Object[] otherSpans = ((Spanned) o).getSpans(0, - ((Spanned) o).length(), Object.class); + Object[] otherSpans = other.getSpans(0, other.length(), Object.class); if (mSpanCount == otherSpans.length) { for (int i = 0; i < mSpanCount; ++i) { Object thisSpan = mSpans[i]; Object otherSpan = otherSpans[i]; - if (!thisSpan.equals(otherSpan) || - getSpanStart(thisSpan) != getSpanStart(otherSpan) || - getSpanEnd(thisSpan) != getSpanEnd(otherSpan) || - getSpanFlags(thisSpan) != getSpanFlags(otherSpan)) { + if (thisSpan == this) { + if (other != otherSpan || + getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || + getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) || + getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) { + return false; + } + } else if (!thisSpan.equals(otherSpan) || + getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || + getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) || + getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) { return false; } } return true; } - } return false; } @@ -1321,7 +1327,9 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable hash = hash * 31 + mSpanCount; for (int i = 0; i < mSpanCount; ++i) { Object span = mSpans[i]; - hash = hash * 31 + span.hashCode(); + if (span != this) { + hash = hash * 31 + span.hashCode(); + } hash = hash * 31 + getSpanStart(span); hash = hash * 31 + getSpanEnd(span); hash = hash * 31 + getSpanFlags(span); diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java index 9b24a2ec421f..456a3e5a6b18 100644 --- a/core/java/android/text/SpannableStringInternal.java +++ b/core/java/android/text/SpannableStringInternal.java @@ -363,23 +363,29 @@ import java.lang.reflect.Array; public boolean equals(Object o) { if (o instanceof Spanned && toString().equals(o.toString())) { + Spanned other = (Spanned) o; // Check span data - Object[] otherSpans = ((Spanned) o).getSpans(0, - ((Spanned) o).length(), Object.class); + Object[] otherSpans = other.getSpans(0, other.length(), Object.class); if (mSpanCount == otherSpans.length) { for (int i = 0; i < mSpanCount; ++i) { Object thisSpan = mSpans[i]; Object otherSpan = otherSpans[i]; - if (!thisSpan.equals(otherSpan) || - getSpanStart(thisSpan) != getSpanStart(otherSpan) || - getSpanEnd(thisSpan) != getSpanEnd(otherSpan) || - getSpanFlags(thisSpan) != getSpanFlags(otherSpan)) { + if (thisSpan == this) { + if (other != otherSpan || + getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || + getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) || + getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) { + return false; + } + } else if (!thisSpan.equals(otherSpan) || + getSpanStart(thisSpan) != other.getSpanStart(otherSpan) || + getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) || + getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) { return false; } } return true; } - } return false; } @@ -391,7 +397,9 @@ import java.lang.reflect.Array; hash = hash * 31 + mSpanCount; for (int i = 0; i < mSpanCount; ++i) { Object span = mSpans[i]; - hash = hash * 31 + span.hashCode(); + if (span != this) { + hash = hash * 31 + span.hashCode(); + } hash = hash * 31 + getSpanStart(span); hash = hash * 31 + getSpanEnd(span); hash = hash * 31 + getSpanFlags(span); diff --git a/core/java/android/transition/ChangeText.java b/core/java/android/transition/ChangeText.java index b1be70f32eed..8677a564c01e 100644 --- a/core/java/android/transition/ChangeText.java +++ b/core/java/android/transition/ChangeText.java @@ -179,8 +179,8 @@ public class ChangeText extends Transition { startSelectionStart = startSelectionEnd = endSelectionStart = endSelectionEnd = -1; } if (!startText.equals(endText)) { - final int startColor = (Integer) startVals.get(PROPNAME_TEXT_COLOR); - final int endColor = (Integer) endVals.get(PROPNAME_TEXT_COLOR); + final int startColor; + final int endColor; if (mChangeBehavior != CHANGE_BEHAVIOR_IN) { view.setText(startText); if (view instanceof EditText) { @@ -189,6 +189,7 @@ public class ChangeText extends Transition { } Animator anim; if (mChangeBehavior == CHANGE_BEHAVIOR_KEEP) { + startColor = endColor = 0; anim = ValueAnimator.ofFloat(0, 1); anim.addListener(new AnimatorListenerAdapter() { @Override @@ -203,6 +204,8 @@ public class ChangeText extends Transition { } }); } else { + startColor = (Integer) startVals.get(PROPNAME_TEXT_COLOR); + endColor = (Integer) endVals.get(PROPNAME_TEXT_COLOR); // Fade out start text ValueAnimator outAnim = null, inAnim = null; if (mChangeBehavior == CHANGE_BEHAVIOR_OUT_IN || diff --git a/core/java/android/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java index eeb6cba7c68e..4af0f51a41e2 100644 --- a/core/java/android/transition/TransitionInflater.java +++ b/core/java/android/transition/TransitionInflater.java @@ -169,7 +169,7 @@ public class TransitionInflater { } else if ("recolor".equals(name)) { transition = new Recolor(); newTransition = true; - } else if ("set".equals(name)) { + } else if ("transitionSet".equals(name)) { transition = new TransitionSet(); TypedArray a = mContext.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TransitionSet); diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java index 9be91d007638..404709c6a112 100644 --- a/core/java/android/transition/TransitionManager.java +++ b/core/java/android/transition/TransitionManager.java @@ -240,12 +240,7 @@ public class TransitionManager { } transition.playTransition(sceneRoot); - // Returning false from onPreDraw() skips the current frame. This is - // necessary to avoid artifacts caused by resetting target views - // to their proper end states for capturing. Waiting until the next - // frame to draw allows these views to have their mid-transition - // values set on them again and avoid artifacts. - return false; + return true; } }; observer.addOnPreDrawListener(listener); diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java index 79cd8b693df2..4545e3b51fc9 100644 --- a/core/java/android/transition/TransitionSet.java +++ b/core/java/android/transition/TransitionSet.java @@ -30,6 +30,22 @@ import java.util.ArrayList; * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition} * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition. + * + * <p>A TransitionSet can be described in a resource file by using the + * tag <code>transitionSet</code>, along with the standard + * attributes of {@link android.R.styleable#TransitionSet} and + * {@link android.R.styleable#Transition}. Child transitions of the + * TransitionSet object can be loaded by adding those child tags inside the + * enclosing <code>transitionSet</code> tag. For example, the following xml + * describes a TransitionSet that plays a Fade and then a ChangeBounds + * transition on the affected view targets:</p> + * <pre> + * <transitionSet xmlns:android="http://schemas.android.com/apk/res/android" + * android:ordering="sequential"> + * <fade/> + * <changeBounds/> + * </transitionSet> + * </pre> */ public class TransitionSet extends Transition { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f763d19b2bc6..caeb1d8cfc80 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2448,24 +2448,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800; /** - * Flag for {@link #setSystemUiVisibility(int)}: View would like the status bar to have - * transparency. - * - * <p>The transparency request may be denied if the bar is in another mode with a specific - * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}. - */ - public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000; - - /** - * Flag for {@link #setSystemUiVisibility(int)}: View would like the navigation bar to have - * transparency. - * - * <p>The transparency request may be denied if the bar is in another mode with a specific - * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}. - */ - public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000; - - /** * @deprecated Use {@link #SYSTEM_UI_FLAG_LOW_PROFILE} instead. */ public static final int STATUS_BAR_HIDDEN = SYSTEM_UI_FLAG_LOW_PROFILE; @@ -2626,6 +2608,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to specify that the status bar is displayed in translucent mode. + */ + public static final int STATUS_BAR_TRANSLUCENT = 0x40000000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to specify that the navigation bar is displayed in translucent mode. + */ + public static final int NAVIGATION_BAR_TRANSLUCENT = 0x80000000; + + /** + * @hide */ public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = 0x0000FFFF; @@ -16934,9 +16936,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param visibility Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE}, - * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, - * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}. */ public void setSystemUiVisibility(int visibility) { if (visibility != mSystemUiVisibility) { @@ -16952,9 +16952,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE}, * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN}, * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}, - * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE}, - * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS}, - * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}. + * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, and {@link #SYSTEM_UI_FLAG_IMMERSIVE}. */ public int getSystemUiVisibility() { return mSystemUiVisibility; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7e3ee5f64057..beb7366ec965 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -754,6 +754,11 @@ public final class ViewRootImpl implements ViewParent, attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility; attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility; mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs); + if ((mWindowAttributesChangesFlag + & WindowManager.LayoutParams.TRANSLUCENT_FLAGS_CHANGED) != 0) { + // Recompute system ui visibility. + mAttachInfo.mRecomputeGlobalAttributes = true; + } if (mWindowAttributes.packageName == null) { mWindowAttributes.packageName = mBasePackageName; } @@ -1026,6 +1031,7 @@ public final class ViewRootImpl implements ViewParent, mView.dispatchCollectViewAttributes(attachInfo, 0); attachInfo.mSystemUiVisibility &= ~attachInfo.mDisabledSystemUiVisibility; WindowManager.LayoutParams params = mWindowAttributes; + attachInfo.mSystemUiVisibility |= getImpliedSystemUiVisibility(params); if (attachInfo.mKeepScreenOn != oldScreenOn || attachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility || attachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) { @@ -1039,6 +1045,18 @@ public final class ViewRootImpl implements ViewParent, return false; } + private int getImpliedSystemUiVisibility(WindowManager.LayoutParams params) { + int vis = 0; + // Translucent decor window flags imply stable system ui visibility. + if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) { + vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + } + if ((params.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) != 0) { + vis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + } + return vis; + } + private boolean measureHierarchy(final View host, final WindowManager.LayoutParams lp, final Resources res, final int desiredWindowWidth, final int desiredWindowHeight) { int childWidthMeasureSpec; diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 815b97c60657..0ce4da5c4dc5 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -838,6 +838,44 @@ public interface WindowManager extends ViewManager { */ public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000; + /** + * Window flag: request a translucent status bar with minimal system-provided + * background protection. + * + * <p>This flag can be controlled in your theme through the + * {@link android.R.attr#windowTranslucentStatus} attribute; this attribute + * is automatically set for you in the standard translucent decor themes + * such as + * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and + * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p> + * + * <p>When this flag is enabled for a window, it automatically sets + * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and + * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}.</p> + */ + public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000; + + /** + * Window flag: request a translucent navigation bar with minimal system-provided + * background protection. + * + * <p>This flag can be controlled in your theme through the + * {@link android.R.attr#windowTranslucentNavigation} attribute; this attribute + * is automatically set for you in the standard translucent decor themes + * such as + * {@link android.R.style#Theme_Holo_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_Holo_Light_NoActionBar_TranslucentDecor}, + * {@link android.R.style#Theme_DeviceDefault_NoActionBar_TranslucentDecor}, and + * {@link android.R.style#Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor}.</p> + * + * <p>When this flag is enabled for a window, it automatically sets + * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and + * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}.</p> + */ + public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000; + // ----- HIDDEN FLAGS. // These start at the high bit and go down. @@ -956,7 +994,11 @@ public interface WindowManager extends ViewManager { @ViewDebug.FlagToString(mask = FLAG_HARDWARE_ACCELERATED, equals = FLAG_HARDWARE_ACCELERATED, name = "FLAG_HARDWARE_ACCELERATED"), @ViewDebug.FlagToString(mask = FLAG_LOCAL_FOCUS_MODE, equals = FLAG_LOCAL_FOCUS_MODE, - name = "FLAG_LOCAL_FOCUS_MODE") + name = "FLAG_LOCAL_FOCUS_MODE"), + @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_STATUS, equals = FLAG_TRANSLUCENT_STATUS, + name = "FLAG_TRANSLUCENT_STATUS"), + @ViewDebug.FlagToString(mask = FLAG_TRANSLUCENT_NAVIGATION, equals = FLAG_TRANSLUCENT_NAVIGATION, + name = "FLAG_TRANSLUCENT_NAVIGATION") }) public int flags; @@ -1046,6 +1088,11 @@ public interface WindowManager extends ViewManager { * {@hide} */ public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100; + /** Window flag: maintain the previous translucent decor state when this window + * becomes top-most. + * {@hide} */ + public static final int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR = 0x00000200; + /** * Control flags that are private to the platform. * @hide @@ -1576,6 +1623,8 @@ public interface WindowManager extends ViewManager { /** {@hide} */ public static final int USER_ACTIVITY_TIMEOUT_CHANGED = 1<<18; /** {@hide} */ + public static final int TRANSLUCENT_FLAGS_CHANGED = 1<<19; + /** {@hide} */ public static final int EVERYTHING_CHANGED = 0xffffffff; // internal buffer to backup/restore parameters under compatibility mode. @@ -1621,6 +1670,10 @@ public interface WindowManager extends ViewManager { changes |= TYPE_CHANGED; } if (flags != o.flags) { + final int diff = flags ^ o.flags; + if ((diff & (FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION)) != 0) { + changes |= TRANSLUCENT_FLAGS_CHANGED; + } flags = o.flags; changes |= FLAGS_CHANGED; } diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java index e2f6d7d3712a..a70bcdbfca3e 100644 --- a/core/java/android/widget/FastScroller.java +++ b/core/java/android/widget/FastScroller.java @@ -33,6 +33,7 @@ import android.text.TextUtils.TruncateAt; import android.util.IntProperty; import android.util.MathUtils; import android.util.Property; +import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -471,11 +472,11 @@ class FastScroller { final Resources res = context.getResources(); final int minSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_size); final ColorStateList textColor = ta.getColorStateList(TEXT_COLOR); - final float textSize = res.getDimension(R.dimen.fastscroll_overlay_text_size); + final float textSize = res.getDimensionPixelSize(R.dimen.fastscroll_overlay_text_size); final TextView textView = new TextView(context); textView.setLayoutParams(params); textView.setTextColor(textColor); - textView.setTextSize(textSize); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); textView.setSingleLine(true); textView.setEllipsize(TruncateAt.MIDDLE); textView.setGravity(Gravity.CENTER); diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 3e53b91bd0b0..9e35a236fdec 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -27,6 +27,7 @@ import android.graphics.Matrix; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.RectF; +import android.graphics.Xfermode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -73,6 +74,7 @@ public class ImageView extends View { // these are applied to the drawable private ColorFilter mColorFilter; + private Xfermode mXfermode; private int mAlpha = 255; private int mViewAlphaScale = 256; private boolean mColorMod = false; @@ -1125,6 +1127,18 @@ public class ImageView extends View { } /** + * @hide Candidate for future API inclusion + */ + public final void setXfermode(Xfermode mode) { + if (mXfermode != mode) { + mXfermode = mode; + mColorMod = true; + applyColorMod(); + invalidate(); + } + } + + /** * Returns the active color filter for this ImageView. * * @return the active color filter for this ImageView @@ -1200,6 +1214,7 @@ public class ImageView extends View { if (mDrawable != null && mColorMod) { mDrawable = mDrawable.mutate(); mDrawable.setColorFilter(mColorFilter); + mDrawable.setXfermode(mXfermode); mDrawable.setAlpha(mAlpha * mViewAlphaScale >> 8); } } diff --git a/core/java/com/android/internal/widget/SubtitleView.java b/core/java/com/android/internal/widget/SubtitleView.java index e30c1ff37463..ccedf63ca9d5 100644 --- a/core/java/com/android/internal/widget/SubtitleView.java +++ b/core/java/com/android/internal/widget/SubtitleView.java @@ -113,10 +113,10 @@ public class SubtitleView extends View { // TODO: Move these to a default style. final Resources res = getContext().getResources(); final DisplayMetrics m = res.getDisplayMetrics(); - mCornerRadius = res.getDimension(com.android.internal.R.dimen.subtitle_corner_radius); - mOutlineWidth = res.getDimension(com.android.internal.R.dimen.subtitle_outline_width); - mShadowRadius = res.getDimension(com.android.internal.R.dimen.subtitle_shadow_radius); - mShadowOffsetX = res.getDimension(com.android.internal.R.dimen.subtitle_shadow_offset); + mCornerRadius = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_corner_radius); + mOutlineWidth = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_outline_width); + mShadowRadius = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_shadow_radius); + mShadowOffsetX = res.getDimensionPixelSize(com.android.internal.R.dimen.subtitle_shadow_offset); mShadowOffsetY = mShadowOffsetX; mTextPaint = new TextPaint(); @@ -169,9 +169,12 @@ public class SubtitleView extends View { invalidate(); } + /** + * Sets the text size in pixels. + * + * @param size the text size in pixels + */ public void setTextSize(float size) { - final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); - final float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size, metrics); if (mTextPaint.getTextSize() != size) { mTextPaint.setTextSize(size); mInnerPaddingX = (int) (size * INNER_PADDING_RATIO + 0.5f); diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 73f3639b2040..a0c50fae558d 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -868,6 +868,7 @@ size_t TextLayoutShaper::shapeFontRun(const SkPaint* paint) { hb_shape(font, mBuffer, NULL, 0); hb_font_destroy(font); + mShapingPaint.setTypeface(paint->getTypeface()); return baseGlyphCount; } diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 995b4af8e413..4a3990458903 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -609,7 +609,7 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Апп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Апп нь утасны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон хос үүсгэх боломжтой."</string> - <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд Блютүүт хоallow Bluetooth pairing by Application"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд bluetooth хослол хийхийг зөвшөөрнө"</string> <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string> <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон салах"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index c3dc4ff09d6e..9ee8baeb5afb 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -439,6 +439,14 @@ or later. --> <attr name="windowCloseOnTouchOutside" format="boolean" /> + <!-- Flag indicating whether this window requests a translucent status bar. Corresponds + to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS}. --> + <attr name="windowTranslucentStatus" format="boolean" /> + + <!-- Flag indicating whether this window requests a translucent navigation bar. Corresponds + to {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION}. --> + <attr name="windowTranslucentNavigation" format="boolean" /> + <!-- ============ --> <!-- Alert Dialog styles --> <!-- ============ --> @@ -1594,6 +1602,8 @@ <attr name="windowSplitActionBar" /> <attr name="windowEnableSplitTouch" /> <attr name="windowCloseOnTouchOutside" /> + <attr name="windowTranslucentStatus" /> + <attr name="windowTranslucentNavigation" /> <!-- The minimum width the window is allowed to be, along the major axis of the screen. That is, when in landscape. Can be either an absolute dimension or a fraction of the screen size in that diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ea42f38e054e..429a8a4f8b10 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -585,8 +585,8 @@ <!-- Disable lockscreen rotation by default --> <bool name="config_enableLockScreenRotation">false</bool> - <!-- Disable lockscreen transparent bars by default --> - <bool name="config_enableLockScreenTransparentBars">false</bool> + <!-- Disable lockscreen translucent decor by default --> + <bool name="config_enableLockScreenTranslucentDecor">false</bool> <!-- Enable puk unlockscreen by default. If unlock screen is disabled, the puk should be unlocked through Emergency Dialer --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 431fe82c585f..463573375651 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2078,5 +2078,12 @@ <public type="attr" name="requireDeviceUnlock" id="0x010103ec" /> <public type="attr" name="apduServiceBanner" id="0x010103ed" /> <public type="attr" name="accessibilityLiveRegion" id="0x010103ee" /> + <public type="attr" name="windowTranslucentStatus" id="0x010103ef" /> + <public type="attr" name="windowTranslucentNavigation" id="0x010103f0" /> + + <public type="style" name="Theme.Holo.NoActionBar.TranslucentDecor" id="0x010301e1" /> + <public type="style" name="Theme.Holo.Light.NoActionBar.TranslucentDecor" id="0x010301e2" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" id="0x010301e3" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" id="0x010301e4" /> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a403345c7468..ad9144c5008d 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1290,7 +1290,7 @@ <java-symbol type="bool" name="config_disableMenuKeyInLockScreen" /> <java-symbol type="bool" name="config_enableLockBeforeUnlockScreen" /> <java-symbol type="bool" name="config_enableLockScreenRotation" /> - <java-symbol type="bool" name="config_enableLockScreenTransparentBars" /> + <java-symbol type="bool" name="config_enableLockScreenTranslucentDecor" /> <java-symbol type="bool" name="config_lidControlsSleep" /> <java-symbol type="bool" name="config_reverseDefaultRotation" /> <java-symbol type="bool" name="config_showNavigationBar" /> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index eb39926d3a8e..4c80e7d3d85d 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -178,6 +178,8 @@ please see themes_device_defaults.xml. <item name="windowActionBar">false</item> <item name="windowActionModeOverlay">false</item> <item name="windowCloseOnTouchOutside">false</item> + <item name="windowTranslucentStatus">false</item> + <item name="windowTranslucentNavigation">false</item> <!-- Define these here; ContextThemeWrappers around themes that define them should always clear these values. --> @@ -1584,6 +1586,15 @@ please see themes_device_defaults.xml. <item name="android:windowContentOverlay">@null</item> </style> + <!-- Variant of the holographic (dark) theme that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.Holo.NoActionBar.TranslucentDecor"> + <item name="android:windowTranslucentStatus">true</item> + <item name="android:windowTranslucentNavigation">true</item> + <item name="android:windowContentOverlay">@null</item> + </style> + <!-- Variant of the holographic (light) theme with no action bar. --> <style name="Theme.Holo.Light.NoActionBar"> <item name="android:windowActionBar">false</item> @@ -1608,6 +1619,15 @@ please see themes_device_defaults.xml. <item name="android:windowContentOverlay">@null</item> </style> + <!-- Variant of the holographic (light) theme that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.Holo.Light.NoActionBar.TranslucentDecor"> + <item name="android:windowTranslucentStatus">true</item> + <item name="android:windowTranslucentNavigation">true</item> + <item name="android:windowContentOverlay">@null</item> + </style> + <!-- Dialog themes for Holo --> <eat-comment /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 87b1c9d3c824..721c6b04dbf5 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -216,6 +216,12 @@ easier. <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Holo.NoActionBar.Overscan" > </style> + <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Holo.NoActionBar.TranslucentDecor" > + </style> + <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style --> <style name="Theme.DeviceDefault.Light" parent="Theme.Holo.Light" > <!-- Text styles --> @@ -376,6 +382,12 @@ easier. <style name="Theme.DeviceDefault.Light.NoActionBar.Overscan" parent="Theme.Holo.Light.NoActionBar.Overscan" > </style> + <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" + parent="Theme.Holo.Light.NoActionBar.TranslucentDecor" > + </style> <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog. --> diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java index ef858eb0c0bf..5b04a9132612 100644 --- a/graphics/java/android/graphics/Path.java +++ b/graphics/java/android/graphics/Path.java @@ -78,7 +78,11 @@ public class Path { mLastDirection = null; if (rects != null) rects.setEmpty(); } + // We promised not to change this, so preserve it around the native + // call, which does now reset fill type. + final FillType fillType = getFillType(); native_reset(mNativePath); + setFillType(fillType); } /** diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 5ceab36674df..98e3386e7f15 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -28,6 +28,7 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Shader; +import android.graphics.Xfermode; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.LayoutDirection; @@ -531,6 +532,14 @@ public class BitmapDrawable extends Drawable { } /** + * @hide Candidate for future API inclusion + */ + public void setXfermode(Xfermode xfermode) { + mBitmapState.mPaint.setXfermode(xfermode); + invalidateSelf(); + } + + /** * A mutable BitmapDrawable still shares its Bitmap with any other Drawable * that comes from the same resource. * diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 8135716d41e5..8a3d940c63e7 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -17,6 +17,7 @@ package android.graphics.drawable; import android.graphics.Insets; +import android.graphics.Xfermode; import android.os.Trace; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -428,6 +429,15 @@ public abstract class Drawable { public abstract void setColorFilter(ColorFilter cf); /** + * @hide Consider for future API inclusion + */ + public void setXfermode(Xfermode mode) { + // Base implementation drops it on the floor for compatibility. Whee! + // TODO: For this to be included in the API proper, all framework drawables need impls. + // For right now only BitmapDrawable has it. + } + + /** * Specify a color and porterduff mode to be the colorfilter for this * drawable. */ diff --git a/graphics/tests/graphicstests/src/android/graphics/PathTest.java b/graphics/tests/graphicstests/src/android/graphics/PathTest.java new file mode 100644 index 000000000000..96200bc099f9 --- /dev/null +++ b/graphics/tests/graphicstests/src/android/graphics/PathTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2013 The Android Open Source 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.graphics; + +import android.test.suitebuilder.annotation.SmallTest; +import junit.framework.TestCase; + + +public class PathTest extends TestCase { + + @SmallTest + public void testResetPreservesFillType() throws Exception { + Path path = new Path(); + + final Path.FillType defaultFillType = path.getFillType(); + final Path.FillType fillType = Path.FillType.INVERSE_EVEN_ODD; + assertFalse(fillType.equals(defaultFillType)); // Sanity check for the test itself. + + path.setFillType(fillType); + path.reset(); + assertEquals(path.getFillType(), fillType); + } +} diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index c8ee5ad3f968..680e73a10a1b 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -24,6 +24,7 @@ import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.media.RemoteController.OnClientUpdateListener; import android.os.Binder; import android.os.Build; import android.os.Handler; @@ -2270,7 +2271,9 @@ public class AudioManager { * Registers a {@link RemoteController} instance for it to receive media metadata updates * and playback state information from applications using {@link RemoteControlClient}, and * control their playback. - * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. + * <p>Registration requires the {@link OnClientUpdateListener} listener to be one of the + * enabled notification listeners (see + * {@link android.service.notification.NotificationListenerService}). * @param rctlr the object to register. * @return true if the {@link RemoteController} was successfully registered, false if an * error occurred, due to an internal system error, or insufficient permissions. @@ -2280,14 +2283,17 @@ public class AudioManager { return false; } IAudioService service = getService(); + final RemoteController.OnClientUpdateListener l = rctlr.getUpdateListener(); + final ComponentName listenerComponent = new ComponentName(mContext, l.getClass()); try { int[] artworkDimensions = rctlr.getArtworkSize(); - boolean reg = service.registerRemoteControlDisplay(rctlr.getRcDisplay(), - artworkDimensions[0]/*w*/, artworkDimensions[1]/*h*/); + boolean reg = service.registerRemoteController(rctlr.getRcDisplay(), + artworkDimensions[0]/*w*/, artworkDimensions[1]/*h*/, + listenerComponent); rctlr.setIsRegistered(reg); return reg; } catch (RemoteException e) { - Log.e(TAG, "Dead object in registerRemoteControlDisplay " + e); + Log.e(TAG, "Dead object in registerRemoteController " + e); return false; } } @@ -2318,6 +2324,7 @@ public class AudioManager { * artwork size directly, or * {@link #remoteControlDisplayUsesBitmapSize(IRemoteControlDisplay, int, int)} later if artwork * is not yet needed. + * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. * @param rcd the IRemoteControlDisplay */ public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) { @@ -2328,6 +2335,7 @@ public class AudioManager { /** * @hide * Registers a remote control display that will be sent information by remote control clients. + * <p>Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. * @param rcd * @param w the maximum width of the expected bitmap. Negative values indicate it is * useless to send artwork. diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 49c838c87598..79814d14c172 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -48,6 +48,7 @@ import android.content.res.XmlResourceParser; import android.database.ContentObserver; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; +import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -87,6 +88,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -4162,17 +4164,13 @@ public class AudioService extends IAudioService.Stub { //========================================================================================== // RemoteControlDisplay / RemoteControlClient / Remote info //========================================================================================== + public boolean registerRemoteController(IRemoteControlDisplay rcd, int w, int h, + ComponentName listenerComp) { + return mMediaFocusControl.registerRemoteController(rcd, w, h, listenerComp); + } + public boolean registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) { - if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( - android.Manifest.permission.MEDIA_CONTENT_CONTROL)) { - mMediaFocusControl.registerRemoteControlDisplay(rcd, w, h); - return true; - } else { - Log.w(TAG, "Access denied to process: " + Binder.getCallingPid() + - ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL + - " to register IRemoteControlDisplay"); - return false; - } + return mMediaFocusControl.registerRemoteControlDisplay(rcd, w, h); } public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) { diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index e3b87dd87b60..8c05089571e1 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -133,6 +133,8 @@ interface IAudioService { /** * Register an IRemoteControlDisplay. + * Success of registration is subject to a check on + * the android.Manifest.permission.MEDIA_CONTENT_CONTROL permission. * Notify all IRemoteControlClient of the new display and cause the RemoteControlClient * at the top of the stack to update the new display with its information. * @param rcd the IRemoteControlDisplay to register. No effect if null. @@ -142,6 +144,16 @@ interface IAudioService { * display doesn't need to receive artwork. */ boolean registerRemoteControlDisplay(in IRemoteControlDisplay rcd, int w, int h); + + /** + * Like registerRemoteControlDisplay, but with success being subject to a check on + * the android.Manifest.permission.MEDIA_CONTENT_CONTROL permission, and if it fails, + * success is subject to listenerComp being one of the ENABLED_NOTIFICATION_LISTENERS + * components. + */ + boolean registerRemoteController(in IRemoteControlDisplay rcd, int w, int h, + in ComponentName listenerComp); + /** * Unregister an IRemoteControlDisplay. * No effect if the IRemoteControlDisplay hasn't been successfully registered. diff --git a/media/java/android/media/IRemoteControlClient.aidl b/media/java/android/media/IRemoteControlClient.aidl index 999b8bad7b6b..aa142d6e7da8 100644 --- a/media/java/android/media/IRemoteControlClient.aidl +++ b/media/java/android/media/IRemoteControlClient.aidl @@ -56,6 +56,7 @@ oneway interface IRemoteControlClient void unplugRemoteControlDisplay(IRemoteControlDisplay rcd); void setBitmapSizeForDisplay(IRemoteControlDisplay rcd, int w, int h); void setWantsSyncForDisplay(IRemoteControlDisplay rcd, boolean wantsSync); + void enableRemoteControlDisplay(IRemoteControlDisplay rcd, boolean enabled); void seekTo(int clientGeneration, long timeMs); void updateMetadata(int clientGeneration, int key, in Rating value); }
\ No newline at end of file diff --git a/media/java/android/media/IRemoteControlDisplay.aidl b/media/java/android/media/IRemoteControlDisplay.aidl index 583f436690c6..160903048478 100644 --- a/media/java/android/media/IRemoteControlDisplay.aidl +++ b/media/java/android/media/IRemoteControlDisplay.aidl @@ -41,6 +41,12 @@ oneway interface IRemoteControlDisplay boolean clearing); /** + * Sets whether the controls of this display are enabled + * @param if false, the display shouldn't any commands + */ + void setEnabled(boolean enabled); + + /** * Sets the playback information (state, position and speed) of a client. * @param generationId the current generation ID as known by this client * @param state the current playback state, one of the following values: diff --git a/media/java/android/media/MediaFocusControl.java b/media/java/android/media/MediaFocusControl.java index 2a7a731cb10b..d18532117acf 100644 --- a/media/java/android/media/MediaFocusControl.java +++ b/media/java/android/media/MediaFocusControl.java @@ -17,6 +17,7 @@ package android.media; import android.app.Activity; +import android.app.ActivityManager; import android.app.AppOpsManager; import android.app.KeyguardManager; import android.app.PendingIntent; @@ -30,6 +31,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.database.ContentObserver; +import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -45,6 +48,7 @@ import android.speech.RecognizerIntent; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; +import android.util.Slog; import android.view.KeyEvent; import java.io.FileDescriptor; @@ -78,6 +82,7 @@ public class MediaFocusControl implements OnFinished { private final AppOpsManager mAppOps; private final KeyguardManager mKeyguardManager; private final AudioService mAudioService; + private final NotificationListenerObserver mNotifListenerObserver; protected MediaFocusControl(Looper looper, Context cntxt, VolumeController volumeCtrl, AudioService as) { @@ -111,6 +116,7 @@ public class MediaFocusControl implements OnFinished { mAppOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE); mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + mNotifListenerObserver = new NotificationListenerObserver(); mHasRemotePlayback = false; mMainRemoteIsActive = false; @@ -125,6 +131,182 @@ public class MediaFocusControl implements OnFinished { } //========================================================================================== + // Management of RemoteControlDisplay registration permissions + //========================================================================================== + private final static Uri ENABLED_NOTIFICATION_LISTENERS_URI = + Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); + + private class NotificationListenerObserver extends ContentObserver { + + NotificationListenerObserver() { + super(mEventHandler); + mContentResolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.ENABLED_NOTIFICATION_LISTENERS), false, this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + if (!ENABLED_NOTIFICATION_LISTENERS_URI.equals(uri) || selfChange) { + return; + } + if (DEBUG_RC) { Log.d(TAG, "NotificationListenerObserver.onChange()"); } + postReevaluateRemoteControlDisplays(); + } + } + + private final static int RCD_REG_FAILURE = 0; + private final static int RCD_REG_SUCCESS_PERMISSION = 1; + private final static int RCD_REG_SUCCESS_ENABLED_NOTIF = 2; + + /** + * Checks a caller's authorization to register an IRemoteControlDisplay. + * Authorization is granted if one of the following is true: + * <ul> + * <li>the caller has android.Manifest.permission.MEDIA_CONTENT_CONTROL permission</li> + * <li>the caller's listener is one of the enabled notification listeners</li> + * </ul> + * @return RCD_REG_FAILURE if it's not safe to proceed with the IRemoteControlDisplay + * registration. + */ + private int checkRcdRegistrationAuthorization(ComponentName listenerComp) { + // MEDIA_CONTENT_CONTROL permission check + if (PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( + android.Manifest.permission.MEDIA_CONTENT_CONTROL)) { + if (DEBUG_RC) { Log.d(TAG, "ok to register Rcd: has MEDIA_CONTENT_CONTROL permission");} + return RCD_REG_SUCCESS_PERMISSION; + } + + // ENABLED_NOTIFICATION_LISTENERS settings check + if (listenerComp != null) { + // this call is coming from an app, can't use its identity to read secure settings + final long ident = Binder.clearCallingIdentity(); + try { + final int currentUser = ActivityManager.getCurrentUser(); + final String enabledNotifListeners = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, + currentUser); + if (enabledNotifListeners != null) { + final String[] components = enabledNotifListeners.split(":"); + for (int i=0; i<components.length; i++) { + final ComponentName component = + ComponentName.unflattenFromString(components[i]); + if (component != null) { + if (listenerComp.equals(component)) { + if (DEBUG_RC) { Log.d(TAG, "ok to register RCC: " + component + + " is authorized notification listener"); } + return RCD_REG_SUCCESS_ENABLED_NOTIF; + } + } + } + } + if (DEBUG_RC) { Log.d(TAG, "not ok to register RCD, " + listenerComp + + " is not in list of ENABLED_NOTIFICATION_LISTENERS"); } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + return RCD_REG_FAILURE; + } + + protected boolean registerRemoteController(IRemoteControlDisplay rcd, int w, int h, + ComponentName listenerComp) { + int reg = checkRcdRegistrationAuthorization(listenerComp); + if (reg != RCD_REG_FAILURE) { + registerRemoteControlDisplay_int(rcd, w, h, listenerComp); + return true; + } else { + Slog.w(TAG, "Access denied to process: " + Binder.getCallingPid() + + ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL + + " or be an enabled NotificationListenerService for registerRemoteController"); + return false; + } + } + + protected boolean registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) { + int reg = checkRcdRegistrationAuthorization(null); + if (reg != RCD_REG_FAILURE) { + registerRemoteControlDisplay_int(rcd, w, h, null); + return true; + } else { + Slog.w(TAG, "Access denied to process: " + Binder.getCallingPid() + + ", must have permission " + android.Manifest.permission.MEDIA_CONTENT_CONTROL + + " to register IRemoteControlDisplay"); + return false; + } + } + + private void postReevaluateRemoteControlDisplays() { + sendMsg(mEventHandler, MSG_REEVALUATE_RCD, SENDMSG_QUEUE, 0, 0, null, 0); + } + + private void onReevaluateRemoteControlDisplays() { + if (DEBUG_RC) { Log.d(TAG, "onReevaluateRemoteControlDisplays()"); } + // read which components are enabled notification listeners + final int currentUser = ActivityManager.getCurrentUser(); + final String enabledNotifListeners = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, + currentUser); + if (DEBUG_RC) { Log.d(TAG, " > enabled list: " + enabledNotifListeners); } + synchronized(mAudioFocusLock) { + synchronized(mRCStack) { + // check whether the "enable" status of each RCD with a notification listener + // has changed + final String[] enabledComponents; + if (enabledNotifListeners == null) { + enabledComponents = null; + } else { + enabledComponents = enabledNotifListeners.split(":"); + } + final Iterator<DisplayInfoForServer> displayIterator = mRcDisplays.iterator(); + while (displayIterator.hasNext()) { + final DisplayInfoForServer di = + (DisplayInfoForServer) displayIterator.next(); + if (di.mClientNotifListComp != null) { + boolean wasEnabled = di.mEnabled; + di.mEnabled = isComponentInStringArray(di.mClientNotifListComp, + enabledComponents); + if (wasEnabled != di.mEnabled){ + try { + // tell the RCD whether it's enabled + di.mRcDisplay.setEnabled(di.mEnabled); + // tell the RCCs about the change for this RCD + enableRemoteControlDisplayForClient_syncRcStack( + di.mRcDisplay, di.mEnabled); + } catch (RemoteException e) { + Log.e(TAG, "Error en/disabling RCD: ", e); + } + } + } + } + } + } + } + + /** + * @param comp a non-null ComponentName + * @param enabledArray may be null + * @return + */ + private boolean isComponentInStringArray(ComponentName comp, String[] enabledArray) { + if (enabledArray == null || enabledArray.length == 0) { + if (DEBUG_RC) { Log.d(TAG, " > " + comp + " is NOT enabled"); } + return false; + } + final String compString = comp.flattenToString(); + for (int i=0; i<enabledArray.length; i++) { + if (compString.equals(enabledArray[i])) { + if (DEBUG_RC) { Log.d(TAG, " > " + compString + " is enabled"); } + return true; + } + } + if (DEBUG_RC) { Log.d(TAG, " > " + compString + " is NOT enabled"); } + return false; + } + + //========================================================================================== // Internal event handling //========================================================================================== @@ -140,6 +322,7 @@ public class MediaFocusControl implements OnFinished { private static final int MSG_RCC_SEEK_REQUEST = 8; private static final int MSG_RCC_UPDATE_METADATA = 9; private static final int MSG_RCDISPLAY_INIT_INFO = 10; + private static final int MSG_REEVALUATE_RCD = 11; // sendMsg() flags /** If the msg is already queued, replace it with this one. */ @@ -221,6 +404,10 @@ public class MediaFocusControl implements OnFinished { onRcDisplayInitInfo((IRemoteControlDisplay)msg.obj /*newRcd*/, msg.arg1/*w*/, msg.arg2/*h*/); break; + + case MSG_REEVALUATE_RCD: + onReevaluateRemoteControlDisplays(); + break; } } } @@ -1193,8 +1380,9 @@ public class MediaFocusControl implements OnFinished { final DisplayInfoForServer di = (DisplayInfoForServer) displayIterator.next(); pw.println(" IRCD: " + di.mRcDisplay + " -- w:" + di.mArtworkExpectedWidth + - " -- h:" + di.mArtworkExpectedHeight+ - " -- wantsPosSync:" + di.mWantsPositionSync); + " -- h:" + di.mArtworkExpectedHeight + + " -- wantsPosSync:" + di.mWantsPositionSync + + " -- " + (di.mEnabled ? "enabled" : "disabled")); } } } @@ -1834,11 +2022,13 @@ public class MediaFocusControl implements OnFinished { */ private class DisplayInfoForServer implements IBinder.DeathRecipient { /** may never be null */ - private IRemoteControlDisplay mRcDisplay; - private IBinder mRcDisplayBinder; + private final IRemoteControlDisplay mRcDisplay; + private final IBinder mRcDisplayBinder; private int mArtworkExpectedWidth = -1; private int mArtworkExpectedHeight = -1; private boolean mWantsPositionSync = false; + private ComponentName mClientNotifListComp; + private boolean mEnabled = true; public DisplayInfoForServer(IRemoteControlDisplay rcd, int w, int h) { if (DEBUG_RC) Log.i(TAG, "new DisplayInfoForServer for " + rcd + " w=" + w + " h=" + h); @@ -1911,6 +2101,23 @@ public class MediaFocusControl implements OnFinished { } } + private void enableRemoteControlDisplayForClient_syncRcStack(IRemoteControlDisplay rcd, + boolean enabled) { + // let all the remote control clients know whether the given display is enabled + // (so the remote control stack traversal order doesn't matter). + final Iterator<RemoteControlStackEntry> stackIterator = mRCStack.iterator(); + while(stackIterator.hasNext()) { + RemoteControlStackEntry rcse = stackIterator.next(); + if(rcse.mRcClient != null) { + try { + rcse.mRcClient.enableRemoteControlDisplay(rcd, enabled); + } catch (RemoteException e) { + Log.e(TAG, "Error connecting RCD to client: ", e); + } + } + } + } + /** * Is the remote control display interface already registered * @param rcd @@ -1937,8 +2144,11 @@ public class MediaFocusControl implements OnFinished { * display doesn't need to receive artwork. * @param h the maximum height of the expected bitmap. Negative or zero values indicate this * display doesn't need to receive artwork. + * @param listenerComp the component for the listener interface, may be null if it's not needed + * to verify it belongs to one of the enabled notification listeners */ - protected void registerRemoteControlDisplay(IRemoteControlDisplay rcd, int w, int h) { + private void registerRemoteControlDisplay_int(IRemoteControlDisplay rcd, int w, int h, + ComponentName listenerComp) { if (DEBUG_RC) Log.d(TAG, ">>> registerRemoteControlDisplay("+rcd+")"); synchronized(mAudioFocusLock) { synchronized(mRCStack) { @@ -1946,6 +2156,8 @@ public class MediaFocusControl implements OnFinished { return; } DisplayInfoForServer di = new DisplayInfoForServer(rcd, w, h); + di.mEnabled = true; + di.mClientNotifListComp = listenerComp; if (!di.init()) { if (DEBUG_RC) Log.e(TAG, " error registering RCD"); return; diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java index 497b8b3695b6..0c00abaa93ff 100644 --- a/media/java/android/media/RemoteControlClient.java +++ b/media/java/android/media/RemoteControlClient.java @@ -1049,6 +1049,7 @@ public class RemoteControlClient private int mArtworkExpectedWidth; private int mArtworkExpectedHeight; private boolean mWantsPositionSync = false; + private boolean mEnabled = true; DisplayInfoForClient(IRemoteControlDisplay rcd, int w, int h) { mRcDisplay = rcd; @@ -1165,6 +1166,14 @@ public class RemoteControlClient } } + public void enableRemoteControlDisplay(IRemoteControlDisplay rcd, boolean enabled) { + // only post messages, we can't block here + if ((mEventHandler != null) && (rcd != null)) { + mEventHandler.sendMessage(mEventHandler.obtainMessage( + MSG_DISPLAY_ENABLE, enabled ? 1 : 0, 0/*arg2 ignored*/, rcd)); + } + } + public void seekTo(int generationId, long timeMs) { // only post messages, we can't block here if (mEventHandler != null) { @@ -1227,6 +1236,7 @@ public class RemoteControlClient private final static int MSG_DISPLAY_WANTS_POS_SYNC = 12; private final static int MSG_UPDATE_METADATA = 13; private final static int MSG_REQUEST_METADATA_ARTWORK = 14; + private final static int MSG_DISPLAY_ENABLE = 15; private class EventHandler extends Handler { public EventHandler(RemoteControlClient rcc, Looper looper) { @@ -1290,6 +1300,9 @@ public class RemoteControlClient case MSG_UPDATE_METADATA: onUpdateMetadata(msg.arg1, msg.arg2, msg.obj); break; + case MSG_DISPLAY_ENABLE: + onDisplayEnable((IRemoteControlDisplay)msg.obj, msg.arg1 == 1); + break; default: Log.e(TAG, "Unknown event " + msg.what + " in RemoteControlClient handler"); } @@ -1315,13 +1328,15 @@ public class RemoteControlClient final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator(); while (displayIterator.hasNext()) { final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); - try { - di.mRcDisplay.setPlaybackState(mInternalClientGenId, - mPlaybackState, mPlaybackStateChangeTimeMs, mPlaybackPositionMs, - mPlaybackSpeed); - } catch (RemoteException e) { - Log.e(TAG, "Error in setPlaybackState(), dead display " + di.mRcDisplay, e); - displayIterator.remove(); + if (di.mEnabled) { + try { + di.mRcDisplay.setPlaybackState(mInternalClientGenId, + mPlaybackState, mPlaybackStateChangeTimeMs, mPlaybackPositionMs, + mPlaybackSpeed); + } catch (RemoteException e) { + Log.e(TAG, "Error in setPlaybackState(), dead display " + di.mRcDisplay, e); + displayIterator.remove(); + } } } } @@ -1341,11 +1356,13 @@ public class RemoteControlClient final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator(); while (displayIterator.hasNext()) { final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); - try { - di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata); - } catch (RemoteException e) { - Log.e(TAG, "Error in setMetadata(), dead display " + di.mRcDisplay, e); - displayIterator.remove(); + if (di.mEnabled) { + try { + di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata); + } catch (RemoteException e) { + Log.e(TAG, "Error in setMetadata(), dead display " + di.mRcDisplay, e); + displayIterator.remove(); + } } } } @@ -1367,13 +1384,15 @@ public class RemoteControlClient final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator(); while (displayIterator.hasNext()) { final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); - try { - di.mRcDisplay.setTransportControlInfo(mInternalClientGenId, - mTransportControlFlags, mPlaybackPositionCapabilities); - } catch (RemoteException e) { - Log.e(TAG, "Error in setTransportControlFlags(), dead display " + di.mRcDisplay, - e); - displayIterator.remove(); + if (di.mEnabled) { + try { + di.mRcDisplay.setTransportControlInfo(mInternalClientGenId, + mTransportControlFlags, mPlaybackPositionCapabilities); + } catch (RemoteException e) { + Log.e(TAG, "Error in setTransportControlFlags(), dead display " + di.mRcDisplay, + e); + displayIterator.remove(); + } } } } @@ -1438,12 +1457,14 @@ public class RemoteControlClient while (displayIterator.hasNext()) { final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); try { - if ((di.mArtworkExpectedWidth > 0) && (di.mArtworkExpectedHeight > 0)) { - Bitmap artwork = scaleBitmapIfTooBig(mOriginalArtwork, - di.mArtworkExpectedWidth, di.mArtworkExpectedHeight); - di.mRcDisplay.setAllMetadata(mInternalClientGenId, mMetadata, artwork); - } else { - di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata); + if (di.mEnabled) { + if ((di.mArtworkExpectedWidth > 0) && (di.mArtworkExpectedHeight > 0)) { + Bitmap artwork = scaleBitmapIfTooBig(mOriginalArtwork, + di.mArtworkExpectedWidth, di.mArtworkExpectedHeight); + di.mRcDisplay.setAllMetadata(mInternalClientGenId, mMetadata, artwork); + } else { + di.mRcDisplay.setMetadata(mInternalClientGenId, mMetadata); + } } } catch (RemoteException e) { Log.e(TAG, "Error when setting metadata, dead display " + di.mRcDisplay, e); @@ -1578,8 +1599,10 @@ public class RemoteControlClient ((di.mArtworkExpectedWidth != w) || (di.mArtworkExpectedHeight != h))) { di.mArtworkExpectedWidth = w; di.mArtworkExpectedHeight = h; - if (!sendArtworkToDisplay(di)) { - displayIterator.remove(); + if (di.mEnabled) { + if (!sendArtworkToDisplay(di)) { + displayIterator.remove(); + } } break; } @@ -1597,11 +1620,13 @@ public class RemoteControlClient // that gets upated, and whether the list has one entry that wants position sync while (displayIterator.hasNext()) { final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); - if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) { - di.mWantsPositionSync = wantsSync; - } - if (di.mWantsPositionSync) { - newNeedsPositionSync = true; + if (di.mEnabled) { + if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) { + di.mWantsPositionSync = wantsSync; + } + if (di.mWantsPositionSync) { + newNeedsPositionSync = true; + } } } mNeedsPositionSync = newNeedsPositionSync; @@ -1612,6 +1637,19 @@ public class RemoteControlClient } } + /** pre-condition rcd != null */ + private void onDisplayEnable(IRemoteControlDisplay rcd, boolean enable) { + synchronized(mCacheLock) { + final Iterator<DisplayInfoForClient> displayIterator = mRcDisplays.iterator(); + while (displayIterator.hasNext()) { + final DisplayInfoForClient di = (DisplayInfoForClient) displayIterator.next(); + if (di.mRcDisplay.asBinder().equals(rcd.asBinder())) { + di.mEnabled = enable; + } + } + } + } + private void onSeekTo(int generationId, long timeMs) { synchronized (mCacheLock) { if ((mCurrentClientGenId == generationId) && (mPositionUpdateListener != null)) { diff --git a/media/java/android/media/RemoteController.java b/media/java/android/media/RemoteController.java index 22f63435376b..c6d629615f89 100644 --- a/media/java/android/media/RemoteController.java +++ b/media/java/android/media/RemoteController.java @@ -42,14 +42,14 @@ import android.view.KeyEvent; * <p> * A RemoteController shall be registered through * {@link AudioManager#registerRemoteController(RemoteController)} in order for the system to send - * media event updates to the listener set in - * {@link #setOnClientUpdateListener(OnClientUpdateListener)}. This listener is a subclass of - * the {@link OnClientUpdateListener} abstract class. Override its methods to receive the - * information published by the active {@link RemoteControlClient} instances. - * By default an {@link OnClientUpdateListener} implementation will not receive bitmaps for album - * art. Use {@link #setArtworkConfiguration(int, int)} to receive images as well. + * media event updates to the {@link OnClientUpdateListener} listener set in the class constructor. + * Implement the methods of the interface to receive the information published by the active + * {@link RemoteControlClient} instances. + * <br>By default an {@link OnClientUpdateListener} implementation will not receive bitmaps for + * album art. Use {@link #setArtworkConfiguration(int, int)} to receive images as well. * <p> - * Registration requires the {@link Manifest.permission#MEDIA_CONTENT_CONTROL} permission. + * Registration requires the {@link OnClientUpdateListener} listener to be one of the enabled + * notification listeners (see {@link android.service.notification.NotificationListenerService}). */ public final class RemoteController { @@ -77,30 +77,39 @@ public final class RemoteController private PendingIntent mClientPendingIntentCurrent; private OnClientUpdateListener mOnClientUpdateListener; private PlaybackInfo mLastPlaybackInfo; - private int mLastTransportControlFlags = TRANSPORT_UNKNOWN; private int mArtworkWidth = -1; private int mArtworkHeight = -1; + private boolean mEnabled = true; /** * Class constructor. - * @param context non-null the {@link Context}, must be non-null - * @throws java.lang.IllegalArgumentException + * @param context the {@link Context}, must be non-null. + * @param updateListener the listener to be called whenever new client information is available, + * must be non-null. + * @throws IllegalArgumentException */ - public RemoteController(Context context) throws IllegalArgumentException { - this(context, null); + public RemoteController(Context context, OnClientUpdateListener updateListener) + throws IllegalArgumentException { + this(context, updateListener, null); } /** * Class constructor. + * @param context the {@link Context}, must be non-null. + * @param updateListener the listener to be called whenever new client information is available, + * must be non-null. * @param looper the {@link Looper} on which to run the event loop, * or null to use the current thread's looper. - * @param context the {@link Context}, must be non-null * @throws java.lang.IllegalArgumentException */ - public RemoteController(Context context, Looper looper) throws IllegalArgumentException { + public RemoteController(Context context, OnClientUpdateListener updateListener, Looper looper) + throws IllegalArgumentException { if (context == null) { throw new IllegalArgumentException("Invalid null Context"); } + if (updateListener == null) { + throw new IllegalArgumentException("Invalid null OnClientUpdateListener"); + } if (looper != null) { mEventHandler = new EventHandler(this, looper); } else { @@ -111,6 +120,7 @@ public final class RemoteController throw new IllegalArgumentException("Calling thread not associated with a looper"); } } + mOnClientUpdateListener = updateListener; mContext = context; mRcd = new RcDisplay(); mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); @@ -125,31 +135,31 @@ public final class RemoteController /** - * An abstract class definition for the callbacks to be invoked whenever media events, metadata + * Interface definition for the callbacks to be invoked whenever media events, metadata * and playback status are available. */ - public static abstract class OnClientUpdateListener { + public interface OnClientUpdateListener { /** - * The method called whenever all information previously received through the other + * Called whenever all information, previously received through the other * methods of the listener, is no longer valid and is about to be refreshed. * This is typically called whenever a new {@link RemoteControlClient} has been selected * by the system to have its media information published. * @param clearing true if there is no selected RemoteControlClient and no information * is available. */ - public void onClientChange(boolean clearing) { } + public void onClientChange(boolean clearing); /** - * The method called whenever the playback state has changed. + * Called whenever the playback state has changed. * It is called when no information is known about the playback progress in the media and * the playback speed. * @param state one of the playback states authorized * in {@link RemoteControlClient#setPlaybackState(int)}. */ - public void onClientPlaybackStateUpdate(int state) { } + public void onClientPlaybackStateUpdate(int state); /** - * The method called whenever the playback state has changed, and playback position and - * speed are known. + * Called whenever the playback state has changed, and playback position + * and speed are known. * @param state one of the playback states authorized * in {@link RemoteControlClient#setPlaybackState(int)}. * @param stateChangeTimeMs the system time at which the state change was reported, @@ -161,15 +171,15 @@ public final class RemoteController * playing (e.g. when state is {@link RemoteControlClient#PLAYSTATE_ERROR}). */ public void onClientPlaybackStateUpdate(int state, long stateChangeTimeMs, - long currentPosMs, float speed) { } + long currentPosMs, float speed); /** - * The method called whenever the transport control flags have changed. + * Called whenever the transport control flags have changed. * @param transportControlFlags one of the flags authorized * in {@link RemoteControlClient#setTransportControlFlags(int)}. */ - public void onClientTransportControlUpdate(int transportControlFlags) { } + public void onClientTransportControlUpdate(int transportControlFlags); /** - * The method called whenever new metadata is available. + * Called whenever new metadata is available. * See the {@link MediaMetadataEditor#putLong(int, long)}, * {@link MediaMetadataEditor#putString(int, String)}, * {@link MediaMetadataEditor#putBitmap(int, Bitmap)}, and @@ -177,39 +187,9 @@ public final class RemoteController * can be queried. * @param metadataEditor the container of the new metadata. */ - public void onClientMetadataUpdate(MetadataEditor metadataEditor) { } + public void onClientMetadataUpdate(MetadataEditor metadataEditor); }; - /** - * Sets the listener to be called whenever new client information is available. - * This method can only be called on a registered RemoteController. - * @param l the update listener to be called. - */ - public void setOnClientUpdateListener(OnClientUpdateListener l) { - synchronized(mInfoLock) { - mOnClientUpdateListener = l; - if (!mIsRegistered) { - // since the object is not registered, it hasn't received any information from - // RemoteControlClients yet, so we can exit here. - return; - } - if (mLastPlaybackInfo != null) { - sendMsg(mEventHandler, MSG_NEW_PLAYBACK_INFO, SENDMSG_REPLACE, - mClientGenerationIdCurrent /*arg1*/, 0, - mLastPlaybackInfo /*obj*/, 0 /*delay*/); - } - if (mLastTransportControlFlags != TRANSPORT_UNKNOWN) { - sendMsg(mEventHandler, MSG_NEW_TRANSPORT_INFO, SENDMSG_REPLACE, - mClientGenerationIdCurrent /*arg1*/, mLastTransportControlFlags /*arg2*/, - null /*obj*/, 0 /*delay*/); - } - if (mMetadataEditor != null) { - sendMsg(mEventHandler, MSG_NEW_METADATA, SENDMSG_QUEUE, - mClientGenerationIdCurrent /*arg1*/, 0 /*arg2*/, - mMetadataEditor /*obj*/, 0 /*delay*/); - } - } - } /** * @hide @@ -256,6 +236,7 @@ public final class RemoteController return -1; } + /** * Send a simulated key event for a media button to be received by the current client. * To simulate a key press, you must first send a KeyEvent built with @@ -280,17 +261,22 @@ public final class RemoteController * {@link KeyEvent#KEYCODE_MEDIA_CLOSE}, * {@link KeyEvent#KEYCODE_MEDIA_EJECT}, * or {@link KeyEvent#KEYCODE_MEDIA_AUDIO_TRACK}. + * @return true if the event was successfully sent, false otherwise. + * @throws IllegalArgumentException */ - public int sendMediaKeyEvent(KeyEvent keyEvent) { + public boolean sendMediaKeyEvent(KeyEvent keyEvent) throws IllegalArgumentException { if (!MediaFocusControl.isMediaKeyCode(keyEvent.getKeyCode())) { - Log.e(TAG, "Cannot use sendMediaKeyEvent() for a non-media key event"); - return ERROR_BAD_VALUE; + throw new IllegalArgumentException("not a media key event"); } final PendingIntent pi; synchronized(mInfoLock) { if (!mIsRegistered) { Log.e(TAG, "Cannot use sendMediaKeyEvent() from an unregistered RemoteController"); - return ERROR; + return false; + } + if (!mEnabled) { + Log.e(TAG, "Cannot use sendMediaKeyEvent() from a disabled RemoteController"); + return false; } pi = mClientPendingIntentCurrent; } @@ -301,47 +287,37 @@ public final class RemoteController pi.send(mContext, 0, intent); } catch (CanceledException e) { Log.e(TAG, "Error sending intent for media button down: ", e); - return ERROR; + return false; } } else { Log.i(TAG, "No-op when sending key click, no receiver right now"); - return ERROR; + return false; } - return SUCCESS; + return true; } - // Error codes - /** - * Successful operation. - */ - public static final int SUCCESS = 0; - /** - * Unspecified error. - */ - public static final int ERROR = -1; - /** - * Operation failed due to bad parameter value. - */ - public static final int ERROR_BAD_VALUE = -2; - - /** * Sets the new playback position. * This method can only be called on a registered RemoteController. * @param timeMs a 0 or positive value for the new playback position, expressed in ms. - * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE} + * @return true if the command to set the playback position was successfully sent. + * @throws IllegalArgumentException */ - public int seekTo(long timeMs) { + public boolean seekTo(long timeMs) throws IllegalArgumentException { + if (!mEnabled) { + Log.e(TAG, "Cannot use seekTo() from a disabled RemoteController"); + return false; + } if (timeMs < 0) { - return ERROR_BAD_VALUE; + throw new IllegalArgumentException("illegal negative time value"); } final int genId; synchronized (mGenLock) { genId = mClientGenerationIdCurrent; } mAudioManager.setRemoteControlClientPlaybackPosition(genId, timeMs); - return SUCCESS; + return true; } @@ -350,9 +326,11 @@ public final class RemoteController * @param wantBitmap * @param width * @param height - * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE} + * @return true if successful + * @throws IllegalArgumentException */ - public int setArtworkConfiguration(boolean wantBitmap, int width, int height) { + public boolean setArtworkConfiguration(boolean wantBitmap, int width, int height) + throws IllegalArgumentException { synchronized (mInfoLock) { if (wantBitmap) { if ((width > 0) && (height > 0)) { @@ -361,8 +339,7 @@ public final class RemoteController mArtworkWidth = width; mArtworkHeight = height; } else { - Log.e(TAG, "Invalid dimensions"); - return ERROR_BAD_VALUE; + throw new IllegalArgumentException("Invalid dimensions"); } } else { mArtworkWidth = -1; @@ -375,7 +352,7 @@ public final class RemoteController // RemoteController.getArtworkSize() when AudioManager.registerRemoteController() // is called. } - return SUCCESS; + return true; } /** @@ -383,17 +360,18 @@ public final class RemoteController * No bitmaps will be received unless this has been specified. * @param width the maximum width in pixels * @param height the maximum height in pixels - * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE} + * @return true if the artwork dimension was successfully set. + * @throws IllegalArgumentException */ - public int setArtworkConfiguration(int width, int height) { + public boolean setArtworkConfiguration(int width, int height) throws IllegalArgumentException { return setArtworkConfiguration(true, width, height); } /** * Prevents this RemoteController from receiving artwork images. - * @return {@link #SUCCESS}, {@link #ERROR} + * @return true if receiving artwork images was successfully disabled. */ - public int clearArtworkConfiguration() { + public boolean clearArtworkConfiguration() { return setArtworkConfiguration(false, -1, -1); } @@ -420,20 +398,20 @@ public final class RemoteController * Set the playback position synchronization mode. * Must be called on a registered RemoteController. * @param sync {@link #POSITION_SYNCHRONIZATION_NONE} or {@link #POSITION_SYNCHRONIZATION_CHECK} - * @return {@link #SUCCESS}, {@link #ERROR} or {@link #ERROR_BAD_VALUE} + * @return true if the synchronization mode was successfully set. + * @throws IllegalArgumentException */ - public int setSynchronizationMode(int sync) { + public boolean setSynchronizationMode(int sync) throws IllegalArgumentException { if ((sync != POSITION_SYNCHRONIZATION_NONE) || (sync != POSITION_SYNCHRONIZATION_CHECK)) { - Log.e(TAG, "Unknown synchronization mode"); - return ERROR_BAD_VALUE; + throw new IllegalArgumentException("Unknown synchronization mode " + sync); } if (!mIsRegistered) { Log.e(TAG, "Cannot set synchronization mode on an unregistered RemoteController"); - return ERROR; + return false; } mAudioManager.remoteControlDisplayWantsPlaybackPositionSync(mRcd, POSITION_SYNCHRONIZATION_CHECK == sync); - return SUCCESS; + return true; } @@ -548,6 +526,11 @@ public final class RemoteController } } + public void setEnabled(boolean enabled) { + sendMsg(mEventHandler, MSG_DISPLAY_ENABLE, SENDMSG_REPLACE, + enabled ? 1 : 0 /*arg1*/, 0, null /*obj*/, 0 /*delay*/); + } + public void setPlaybackState(int genId, int state, long stateChangeTimeMs, long currentPosMs, float speed) { if (DEBUG) { @@ -642,6 +625,7 @@ public final class RemoteController private final static int MSG_NEW_TRANSPORT_INFO = 2; private final static int MSG_NEW_METADATA = 3; // msg always has non-null obj parameter private final static int MSG_CLIENT_CHANGE = 4; + private final static int MSG_DISPLAY_ENABLE = 5; private class EventHandler extends Handler { @@ -667,6 +651,9 @@ public final class RemoteController case MSG_CLIENT_CHANGE: onClientChange(msg.arg1, msg.arg2 == 1); break; + case MSG_DISPLAY_ENABLE: + onDisplayEnable(msg.arg1 == 1); + break; default: Log.e(TAG, "unknown event " + msg.what); } @@ -735,7 +722,6 @@ public final class RemoteController final OnClientUpdateListener l; synchronized(mInfoLock) { l = mOnClientUpdateListener; - mLastTransportControlFlags = transportControlFlags; } if (l != null) { l.onClientTransportControlUpdate(transportControlFlags); @@ -797,6 +783,11 @@ public final class RemoteController } } + private void onDisplayEnable(boolean enabled) { + synchronized(mInfoLock) { + mEnabled = enabled; + } + } //================================================== private static class PlaybackInfo { @@ -818,7 +809,7 @@ public final class RemoteController * Used by AudioManager to mark this instance as registered. * @param registered */ - protected void setIsRegistered(boolean registered) { + void setIsRegistered(boolean registered) { synchronized (mInfoLock) { mIsRegistered = registered; } @@ -829,7 +820,7 @@ public final class RemoteController * Used by AudioManager to access binder to be registered/unregistered inside MediaFocusControl * @return */ - protected RcDisplay getRcDisplay() { + RcDisplay getRcDisplay() { return mRcd; } @@ -838,11 +829,19 @@ public final class RemoteController * Used by AudioManager to read the current artwork dimension * @return array containing width (index 0) and height (index 1) of currently set artwork size */ - protected int[] getArtworkSize() { + int[] getArtworkSize() { synchronized (mInfoLock) { int[] size = { mArtworkWidth, mArtworkHeight }; return size; } } + /** + * @hide + * Used by AudioManager to access user listener receiving the client update notifications + * @return + */ + OnClientUpdateListener getUpdateListener() { + return mOnClientUpdateListener; + } } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java index 874e0780f968..3f17aa9b4649 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/CameraMetadataTest.java @@ -18,9 +18,11 @@ package com.android.mediaframeworktest.unit; import android.os.Parcel; import android.test.suitebuilder.annotation.SmallTest; -import android.graphics.ImageFormat; +import android.graphics.Point; import android.graphics.Rect; -import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.Face; import android.hardware.camera2.Rational; import android.hardware.camera2.Size; import android.hardware.camera2.impl.CameraMetadataNative; @@ -30,9 +32,6 @@ import static android.hardware.camera2.impl.CameraMetadataNative.*; import java.lang.reflect.Array; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.nio.IntBuffer; - -import static org.junit.Assert.assertArrayEquals; /** * <pre> @@ -57,6 +56,7 @@ public class CameraMetadataTest extends junit.framework.TestCase { // Tags static final int ANDROID_COLOR_CORRECTION_MODE = ANDROID_COLOR_CORRECTION_START; static final int ANDROID_COLOR_CORRECTION_TRANSFORM = ANDROID_COLOR_CORRECTION_START + 1; + static final int ANDROID_COLOR_CORRECTION_GAINS = ANDROID_COLOR_CORRECTION_START + 2; static final int ANDROID_CONTROL_AE_ANTIBANDING_MODE = ANDROID_CONTROL_START; static final int ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION = ANDROID_CONTROL_START + 1; @@ -131,7 +131,8 @@ public class CameraMetadataTest extends junit.framework.TestCase { @SmallTest public void testGetTypeFromTag() { assertEquals(TYPE_BYTE, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_MODE)); - assertEquals(TYPE_FLOAT, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_TRANSFORM)); + assertEquals(TYPE_RATIONAL, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_TRANSFORM)); + assertEquals(TYPE_FLOAT, CameraMetadataNative.getNativeType(ANDROID_COLOR_CORRECTION_GAINS)); assertEquals(TYPE_BYTE, CameraMetadataNative.getNativeType(ANDROID_CONTROL_AE_ANTIBANDING_MODE)); assertEquals(TYPE_INT32, CameraMetadataNative.getNativeType(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)); @@ -187,30 +188,30 @@ public class CameraMetadataTest extends junit.framework.TestCase { assertEquals(false, mMetadata.isEmpty()); // - // android.colorCorrection.transform (3x3 matrix) + // android.colorCorrection.colorCorrectionGains (float x 4 array) // - final float[] transformMatrix = new float[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - byte[] transformMatrixAsByteArray = new byte[transformMatrix.length * 4]; - ByteBuffer transformMatrixByteBuffer = - ByteBuffer.wrap(transformMatrixAsByteArray).order(ByteOrder.nativeOrder()); - for (float f : transformMatrix) - transformMatrixByteBuffer.putFloat(f); + final float[] colorCorrectionGains = new float[] { 1.0f, 2.0f, 3.0f, 4.0f}; + byte[] colorCorrectionGainsAsByteArray = new byte[colorCorrectionGains.length * 4]; + ByteBuffer colorCorrectionGainsByteBuffer = + ByteBuffer.wrap(colorCorrectionGainsAsByteArray).order(ByteOrder.nativeOrder()); + for (float f : colorCorrectionGains) + colorCorrectionGainsByteBuffer.putFloat(f); // Read - assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM)); - mMetadata.writeValues(ANDROID_COLOR_CORRECTION_TRANSFORM, transformMatrixAsByteArray); + assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS)); + mMetadata.writeValues(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGainsAsByteArray); // Write - assertArrayEquals(transformMatrixAsByteArray, - mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM)); + assertArrayEquals(colorCorrectionGainsAsByteArray, + mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS)); assertEquals(2, mMetadata.getEntryCount()); assertEquals(false, mMetadata.isEmpty()); // Erase - mMetadata.writeValues(ANDROID_COLOR_CORRECTION_TRANSFORM, null); - assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_TRANSFORM)); + mMetadata.writeValues(ANDROID_COLOR_CORRECTION_GAINS, null); + assertNull(mMetadata.readValues(ANDROID_COLOR_CORRECTION_GAINS)); assertEquals(1, mMetadata.getEntryCount()); } @@ -279,7 +280,7 @@ public class CameraMetadataTest extends junit.framework.TestCase { @SmallTest public void testReadWritePrimitiveArray() { // int32 (n) - checkKeyGetAndSetArray("android.sensor.info.availableSensitivities", int[].class, + checkKeyGetAndSetArray("android.sensor.info.sensitivityRange", int[].class, new int[] { 0xC0FFEE, 0xDEADF00D }); @@ -379,7 +380,9 @@ public class CameraMetadataTest extends junit.framework.TestCase { new AvailableFormat[] { AvailableFormat.RAW_SENSOR, AvailableFormat.YV12, - AvailableFormat.IMPLEMENTATION_DEFINED + AvailableFormat.IMPLEMENTATION_DEFINED, + AvailableFormat.YCbCr_420_888, + AvailableFormat.BLOB }); } @@ -431,12 +434,13 @@ public class CameraMetadataTest extends junit.framework.TestCase { AvailableFormat.RAW_SENSOR, AvailableFormat.YV12, AvailableFormat.IMPLEMENTATION_DEFINED, - AvailableFormat.YCbCr_420_888 + AvailableFormat.YCbCr_420_888, + AvailableFormat.BLOB }); - Key<AeAntibandingMode> availableFormatsKey = - new Key<AeAntibandingMode>("android.scaler.availableFormats", - AeAntibandingMode.class); + Key<AvailableFormat[]> availableFormatsKey = + new Key<AvailableFormat[]>("android.scaler.availableFormats", + AvailableFormat[].class); byte[] availableFormatValues = mMetadata.readValues(CameraMetadataNative .getTag(availableFormatsKey.getName())); @@ -444,7 +448,8 @@ public class CameraMetadataTest extends junit.framework.TestCase { 0x20, 0x32315659, 0x22, - 0x23 + 0x23, + 0x21 }; ByteBuffer bf = ByteBuffer.wrap(availableFormatValues).order(ByteOrder.nativeOrder()); @@ -523,4 +528,115 @@ public class CameraMetadataTest extends junit.framework.TestCase { <T> void compareGeneric(T expected, T actual) { assertEquals(expected, actual); } + + @SmallTest + public void testReadWriteOverride() { + // + // android.scaler.availableFormats (int x n array) + // + int[] availableFormats = new int[] { + 0x20, // RAW_SENSOR + 0x32315659, // YV12 + 0x11, // YCrCb_420_SP + 0x100, // ImageFormat.JPEG + 0x22, // IMPLEMENTATION_DEFINED + 0x23, // YCbCr_420_888 + }; + int[] expectedIntValues = new int[] { + 0x20, // RAW_SENSOR + 0x32315659, // YV12 + 0x11, // YCrCb_420_SP + 0x21, // BLOB + 0x22, // IMPLEMENTATION_DEFINED + 0x23, // YCbCr_420_888 + }; + int availableFormatTag = CameraMetadataNative.getTag("android.scaler.availableFormats"); + + // Write + mMetadata.set(CameraCharacteristics.SCALER_AVAILABLE_FORMATS, availableFormats); + + byte[] availableFormatValues = mMetadata.readValues(availableFormatTag); + + ByteBuffer bf = ByteBuffer.wrap(availableFormatValues).order(ByteOrder.nativeOrder()); + + assertEquals(expectedIntValues.length * 4, availableFormatValues.length); + for (int i = 0; i < expectedIntValues.length; ++i) { + assertEquals(expectedIntValues[i], bf.getInt()); + } + // Read + byte[] availableFormatsAsByteArray = new byte[expectedIntValues.length * 4]; + ByteBuffer availableFormatsByteBuffer = + ByteBuffer.wrap(availableFormatsAsByteArray).order(ByteOrder.nativeOrder()); + for (int value : expectedIntValues) { + availableFormatsByteBuffer.putInt(value); + } + mMetadata.writeValues(availableFormatTag, availableFormatsAsByteArray); + + int[] resultFormats = mMetadata.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS); + assertNotNull("result available formats shouldn't be null", resultFormats); + assertArrayEquals(availableFormats, resultFormats); + + // + // android.statistics.faces (Face x n array) + // + int[] expectedFaceIds = new int[] {1, 2, 3, 4, 5}; + byte[] expectedFaceScores = new byte[] {10, 20, 30, 40, 50}; + int numFaces = expectedFaceIds.length; + Rect[] expectedRects = new Rect[numFaces]; + for (int i = 0; i < numFaces; i++) { + expectedRects[i] = new Rect(i*4 + 1, i * 4 + 2, i * 4 + 3, i * 4 + 4); + } + int[] expectedFaceLM = new int[] { + 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, + }; + Point[] expectedFaceLMPoints = new Point[numFaces * 3]; + for (int i = 0; i < numFaces; i++) { + expectedFaceLMPoints[i*3] = new Point(expectedFaceLM[i*6], expectedFaceLM[i*6+1]); + expectedFaceLMPoints[i*3+1] = new Point(expectedFaceLM[i*6+2], expectedFaceLM[i*6+3]); + expectedFaceLMPoints[i*3+2] = new Point(expectedFaceLM[i*6+4], expectedFaceLM[i*6+5]); + } + + /** + * Read - FACE_DETECT_MODE == FULL + */ + mMetadata.set(CaptureResult.STATISTICS_FACE_DETECT_MODE, + CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL); + mMetadata.set(CaptureResult.STATISTICS_FACE_IDS, expectedFaceIds); + mMetadata.set(CaptureResult.STATISTICS_FACE_SCORES, expectedFaceScores); + mMetadata.set(CaptureResult.STATISTICS_FACE_RECTANGLES, expectedRects); + mMetadata.set(CaptureResult.STATISTICS_FACE_LANDMARKS, expectedFaceLM); + Face[] resultFaces = mMetadata.get(CaptureResult.STATISTICS_FACES); + assertEquals(numFaces, resultFaces.length); + for (int i = 0; i < numFaces; i++) { + assertEquals(expectedFaceIds[i], resultFaces[i].getId()); + assertEquals(expectedFaceScores[i], resultFaces[i].getScore()); + assertEquals(expectedRects[i], resultFaces[i].getBounds()); + assertEquals(expectedFaceLMPoints[i*3], resultFaces[i].getLeftEyePosition()); + assertEquals(expectedFaceLMPoints[i*3+1], resultFaces[i].getRightEyePosition()); + assertEquals(expectedFaceLMPoints[i*3+2], resultFaces[i].getMouthPosition()); + } + + /** + * Read - FACE_DETECT_MODE == SIMPLE + */ + mMetadata.set(CaptureResult.STATISTICS_FACE_DETECT_MODE, + CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE); + mMetadata.set(CaptureResult.STATISTICS_FACE_SCORES, expectedFaceScores); + mMetadata.set(CaptureResult.STATISTICS_FACE_RECTANGLES, expectedRects); + Face[] resultSimpleFaces = mMetadata.get(CaptureResult.STATISTICS_FACES); + assertEquals(numFaces, resultSimpleFaces.length); + for (int i = 0; i < numFaces; i++) { + assertEquals(Face.ID_UNSUPPORTED, resultSimpleFaces[i].getId()); + assertEquals(expectedFaceScores[i], resultSimpleFaces[i].getScore()); + assertEquals(expectedRects[i], resultSimpleFaces[i].getBounds()); + assertNull(resultSimpleFaces[i].getLeftEyePosition()); + assertNull(resultSimpleFaces[i].getRightEyePosition()); + assertNull(resultSimpleFaces[i].getMouthPosition()); + } + + } } diff --git a/packages/DocumentsUI/res/drawable/item_background.xml b/packages/DocumentsUI/res/drawable/item_background.xml index 6fcab3c8264a..ec9be6d18447 100644 --- a/packages/DocumentsUI/res/drawable/item_background.xml +++ b/packages/DocumentsUI/res/drawable/item_background.xml @@ -18,14 +18,14 @@ <item android:state_window_focused="false" android:drawable="@android:color/transparent" /> - <item android:state_focused="true" android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" /> - <item android:state_focused="false" android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" /> - - <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" /> - <item android:state_focused="true" android:state_enabled="false" android:drawable="@*android:drawable/list_selector_disabled_holo_light" /> - <item android:state_focused="true" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" /> - <item android:state_focused="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" /> - <item android:state_focused="true" android:drawable="@*android:drawable/list_focused_holo" /> + <item android:state_focused="true" android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" /> + <item android:state_focused="false" android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" /> + + <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" /> + <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/ic_grid_card_pressed" /> + <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" /> + <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" /> + <item android:state_focused="true" android:drawable="@drawable/ic_grid_card_pressed" /> <item android:drawable="@android:color/transparent" /> diff --git a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml index 851061fe9b51..adbb9da4323f 100644 --- a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml +++ b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml @@ -64,7 +64,7 @@ android:layout_weight="0.5" android:layout_marginEnd="12dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="middle" android:textAlignment="viewStart" style="@style/TextAppearance.Medium" /> @@ -83,7 +83,7 @@ android:layout_weight="0.25" android:layout_marginEnd="12dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> @@ -95,7 +95,7 @@ android:layout_marginEnd="12dp" android:minWidth="70dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewEnd" style="@style/TextAppearance.Small" /> @@ -107,7 +107,7 @@ android:layout_marginEnd="12dp" android:minWidth="70dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewEnd" style="@style/TextAppearance.Small" /> diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml index bb5dce1306d7..3aef1cd3bca5 100644 --- a/packages/DocumentsUI/res/layout/item_doc_grid.xml +++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml @@ -67,7 +67,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="middle" android:textAlignment="viewStart" style="@style/TextAppearance.Medium" /> @@ -97,7 +97,7 @@ android:layout_height="wrap_content" android:layout_weight="0.5" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> @@ -108,7 +108,7 @@ android:layout_weight="0.5" android:layout_marginStart="8dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml index 4c5b2e304f6e..e3a0dddea66c 100644 --- a/packages/DocumentsUI/res/layout/item_doc_list.xml +++ b/packages/DocumentsUI/res/layout/item_doc_list.xml @@ -68,7 +68,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="middle" android:textAlignment="viewStart" style="@style/TextAppearance.Medium" /> @@ -92,24 +92,20 @@ <TextView android:id="@+id/date" - android:layout_width="0dp" + android:layout_width="90dp" android:layout_height="wrap_content" - android:layout_weight="0.25" - android:minWidth="70dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> <TextView android:id="@+id/size" - android:layout_width="0dp" + android:layout_width="90dp" android:layout_height="wrap_content" - android:layout_weight="0.25" android:layout_marginStart="8dp" - android:minWidth="70dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> @@ -117,10 +113,10 @@ android:id="@android:id/summary" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.5" + android:layout_weight="1" android:layout_marginStart="8dp" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml index 9b52d85ca45e..f17c261f7339 100644 --- a/packages/DocumentsUI/res/layout/item_root.xml +++ b/packages/DocumentsUI/res/layout/item_root.xml @@ -43,7 +43,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Medium" /> @@ -52,7 +52,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="end" android:textAlignment="viewStart" style="@style/TextAppearance.Small" /> diff --git a/packages/DocumentsUI/res/layout/item_title.xml b/packages/DocumentsUI/res/layout/item_title.xml index 58016f1fe962..6e96fb534997 100644 --- a/packages/DocumentsUI/res/layout/item_title.xml +++ b/packages/DocumentsUI/res/layout/item_title.xml @@ -38,7 +38,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" - android:ellipsize="marquee" + android:ellipsize="middle" android:textAlignment="viewStart" style="@style/TextAppearance.Medium" /> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index 20f4de9072fb..b703541d40d0 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Скриване на основните елементи"</string> <string name="save_error" msgid="6167009778003223664">"Запазването на документа не бе успешно"</string> <string name="create_error" msgid="3735649141335444215">"Създаването на папката не бе успешно"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Заявката за документи не бе успешна"</string> <string name="root_recent" msgid="4470053704320518133">"Скорошно"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Свободно: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Услуги за съхранение"</string> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index 847482b674cc..4a3ff33c3bb5 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> <string name="save_error" msgid="6167009778003223664">"Error al guardar el documento"</string> <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Error al consultar documentos"</string> <string name="root_recent" msgid="4470053704320518133">"Recientes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string> <string name="root_type_service" msgid="2178854894416775409">"Almacenamiento"</string> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 1cb12f702e10..a8373794396d 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Masquer les racines"</string> <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document"</string> <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Échec de la demande de document"</string> <string name="root_recent" msgid="4470053704320518133">"Récents"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> disponible"</string> <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index f6d7c78549ca..ff9aeda303c8 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="2783841764617238354">"Documents"</string> - <string name="title_open" msgid="4353228937663917801">"Ouvrir sous"</string> + <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string> <string name="menu_grid" msgid="6878021334497835259">"Grille"</string> @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Masquer les répertoires racines"</string> <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document."</string> <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier."</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Échec de la demande de documents."</string> <string name="root_recent" msgid="4470053704320518133">"Récents"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Espace disponible : <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 3ab7bc935fc3..c683f3ebf2f2 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Թաքցնել արմատները"</string> <string name="save_error" msgid="6167009778003223664">"Չհաջողվեց պահել փաստաթուղթը"</string> <string name="create_error" msgid="3735649141335444215">"Չհաջողվեց ստեղծել թղթապանակը"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Փաստաթղթերին հարցում կատարելիս սխալ տեղի ունեցավ"</string> <string name="root_recent" msgid="4470053704320518133">"Վերջին"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ազատ է"</string> <string name="root_type_service" msgid="2178854894416775409">"Պահուստի ծառայություններ"</string> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index aad26b665641..519b936dd40f 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string> <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string> <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Gagal mengirim kueri untuk dokumen"</string> <string name="root_recent" msgid="4470053704320518133">"Terkini"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bebas"</string> <string name="root_type_service" msgid="2178854894416775409">"Layanan penyimpanan"</string> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index c5a50ee768c7..996496d377a0 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ルートを非表示にする"</string> <string name="save_error" msgid="6167009778003223664">"ドキュメントを保存できませんでした"</string> <string name="create_error" msgid="3735649141335444215">"フォルダを作成できませんでした"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"ドキュメントのクエリに失敗しました"</string> <string name="root_recent" msgid="4470053704320518133">"最近"</string> <string name="root_available_bytes" msgid="8568452858617033281">"空き容量: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"ストレージサービス"</string> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 201a89ca33fd..f3e1274850b2 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ფესვების დამალვა"</string> <string name="save_error" msgid="6167009778003223664">"დოკუმენტის შენახვა ვერ მოხერხდა"</string> <string name="create_error" msgid="3735649141335444215">"საქაღალდის შექმნა ვერ მოხერხდა"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"დოკუმენტებზე მოთხოვნა ვერ გაიგზავნა"</string> <string name="root_recent" msgid="4470053704320518133">"ბოლო"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> თავისუფალია"</string> <string name="root_type_service" msgid="2178854894416775409">"მეხსიერების სერვისები"</string> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index 0fef587ee0d5..2cd0d44b3d22 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"루트 숨기기"</string> <string name="save_error" msgid="6167009778003223664">"문서 저장 실패"</string> <string name="create_error" msgid="3735649141335444215">"폴더를 만들지 못함"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"문서를 검색하지 못했습니다."</string> <string name="root_recent" msgid="4470053704320518133">"최근"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> 남음"</string> <string name="root_type_service" msgid="2178854894416775409">"저장용량 서비스"</string> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index 598b417e0551..f861b9967151 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Slėpti šaknis"</string> <string name="save_error" msgid="6167009778003223664">"Nepavyko išsaugoti dokumento"</string> <string name="create_error" msgid="3735649141335444215">"Nepavyko sukurti aplanko"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Nepavyko pateikti dokumentų užklausų"</string> <string name="root_recent" msgid="4470053704320518133">"Naujausi"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Laisvos vietos: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Saugyklos paslaugos"</string> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index f7eb7fa1afbd..7e09c57b1f86 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string> <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string> <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Gagal menanyakan dokumen"</string> <string name="root_recent" msgid="4470053704320518133">"Terbaharu"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string> <string name="root_type_service" msgid="2178854894416775409">"Perkhidmatan storan"</string> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index 7cf3a1326a1d..8831bd833232 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skjul røtter"</string> <string name="save_error" msgid="6167009778003223664">"Kunne ikke lagre dokumentet"</string> <string name="create_error" msgid="3735649141335444215">"Kunne ikke opprette mappen"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Kunne ikke undersøke dokumenter"</string> <string name="root_recent" msgid="4470053704320518133">"Siste"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> gratis"</string> <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 320afc800a9d..f4e55826ed97 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ukryj elementy główne"</string> <string name="save_error" msgid="6167009778003223664">"Nie udało się zapisać dokumentu"</string> <string name="create_error" msgid="3735649141335444215">"Nie udało się utworzyć folderu"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Nie udało się pobrać listy dokumentów"</string> <string name="root_recent" msgid="4470053704320518133">"Ostatnie"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> wolne"</string> <string name="root_type_service" msgid="2178854894416775409">"Usługi pamięci masowej"</string> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index 2c7b0bdfb17f..78fcaf8c9d08 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string> <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Falha ao consultar documentos"</string> <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string> <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index b196d77f4075..5fd44c896e40 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string> <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string> <string name="create_error" msgid="3735649141335444215">"Eroare la crearea dosarului"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Interogarea referitoare la documente nu a reușit"</string> <string name="root_recent" msgid="4470053704320518133">"Recente"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string> <string name="root_type_service" msgid="2178854894416775409">"Servicii de stocare"</string> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index ae9bf54245e1..85fd70e03ba6 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Скрыть"</string> <string name="save_error" msgid="6167009778003223664">"Не удалось сохранить документ"</string> <string name="create_error" msgid="3735649141335444215">"Не удалось создать папку"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Не удалось отправить запрос"</string> <string name="root_recent" msgid="4470053704320518133">"Недавние"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Свободно <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Службы хранения"</string> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index bf20456aa2c5..2a96b1a6de8a 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Skryť korene"</string> <string name="save_error" msgid="6167009778003223664">"Dokument sa nepodarilo uložiť"</string> <string name="create_error" msgid="3735649141335444215">"Priečinok sa nepodarilo vytvoriť"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Zoznam dokumentov sa nepodarilo načítať"</string> <string name="root_recent" msgid="4470053704320518133">"Nedávne"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Voľné: <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Služby úložiska"</string> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 7486741eb569..eb0b19796802 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Сакриј основне елементе"</string> <string name="save_error" msgid="6167009778003223664">"Чување документа није успело"</string> <string name="create_error" msgid="3735649141335444215">"Директоријум није направљен"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Слање упита за документе није успело"</string> <string name="root_recent" msgid="4470053704320518133">"Недавно"</string> <string name="root_available_bytes" msgid="8568452858617033281">"Слободно је <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"Услуге складиштења"</string> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index 123558b794a8..299fda717cef 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ficha usuli"</string> <string name="save_error" msgid="6167009778003223664">"Imeshindwa kuhifadhi hati"</string> <string name="create_error" msgid="3735649141335444215">"Ilishindwa kuunda folda"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Ilishindwa kuhoji hati"</string> <string name="root_recent" msgid="4470053704320518133">"Hivi karibuni"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bila malipo"</string> <string name="root_type_service" msgid="2178854894416775409">"Huduma za hifadhi"</string> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index 503bb4eb2dbe..6ac88105c466 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"ซ่อนราก"</string> <string name="save_error" msgid="6167009778003223664">"การบันทึกเอกสารล้มเหลว"</string> <string name="create_error" msgid="3735649141335444215">"การสร้างโฟลเดอร์ล้มเหลว"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"การค้นหาเอกสารล้มเหลว"</string> <string name="root_recent" msgid="4470053704320518133">"ล่าสุด"</string> <string name="root_available_bytes" msgid="8568452858617033281">"ว่าง <xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"บริการที่เก็บข้อมูล"</string> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index cf46bba37181..e0fd8c85413e 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Itago ang mga root"</string> <string name="save_error" msgid="6167009778003223664">"Hindi na-save ang dokumento"</string> <string name="create_error" msgid="3735649141335444215">"Hindi nagawa ang folder"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Hindi na-query ang mga dokumento"</string> <string name="root_recent" msgid="4470053704320518133">"Kamakailan"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ang libre"</string> <string name="root_type_service" msgid="2178854894416775409">"Mga serbisyo ng storage"</string> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index d4db48d1c156..699a5cda9807 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Kökleri sakla"</string> <string name="save_error" msgid="6167009778003223664">"Doküman kaydedilemedi"</string> <string name="create_error" msgid="3735649141335444215">"Klasör oluşturulamadı"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Dokümanlar sorgulanamadı"</string> <string name="root_recent" msgid="4470053704320518133">"En son"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> boş"</string> <string name="root_type_service" msgid="2178854894416775409">"Depolama hizmetleri"</string> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml index 915fd243e1df..41e29fa9e9b9 100644 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ b/packages/DocumentsUI/res/values-vi/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"Ẩn gốc"</string> <string name="save_error" msgid="6167009778003223664">"Không lưu tài liệu được"</string> <string name="create_error" msgid="3735649141335444215">"Không thể tạo thư mục"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"Không truy vấn được tài liệu"</string> <string name="root_recent" msgid="4470053704320518133">"Gần đây"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> còn trống"</string> <string name="root_type_service" msgid="2178854894416775409">"Dịch vụ lưu trữ"</string> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 93678b1b4c40..742cda7e3eb4 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"隐藏根目录"</string> <string name="save_error" msgid="6167009778003223664">"无法保存文档"</string> <string name="create_error" msgid="3735649141335444215">"无法创建文件夹"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"无法查询文档"</string> <string name="root_recent" msgid="4470053704320518133">"最近"</string> <string name="root_available_bytes" msgid="8568452858617033281">"可用空间:<xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"存储服务"</string> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index 09c40c917dc7..67ed58738e7e 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string> <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string> <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string> <string name="root_recent" msgid="4470053704320518133">"近期用過"</string> <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index 439e92ae4631..269583a7f038 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -37,8 +37,7 @@ <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string> <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string> <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string> - <!-- no translation found for query_error (1222448261663503501) --> - <skip /> + <string name="query_error" msgid="1222448261663503501">"無法查詢文件"</string> <string name="root_recent" msgid="4470053704320518133">"最近使用過的項目"</string> <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string> <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index 12c0b5681753..bedd2cdf8ede 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -31,7 +31,7 @@ <string name="menu_delete" msgid="8138799623850614177">"Susa"</string> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> okukhethiwe"</string> <string name="sort_name" msgid="9183560467917256779">"Ngegama"</string> - <string name="sort_date" msgid="586080032956151448">"Kuguqulwe ngedethi"</string> + <string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string> <string name="sort_size" msgid="3350681319735474741">"Ngosayizi"</string> <string name="drawer_open" msgid="4545466532430226949">"Bonisa izimpande"</string> <string name="drawer_close" msgid="7602734368552123318">"Fihla izimpande"</string> diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 59caad0ecf57..1f3901c7bd24 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -216,6 +216,10 @@ public class DirectoryFragment extends Fragment { final View view = target.getChildAt(i); mRecycleListener.onMovedToScrapHeap(view); } + + // Tear down any selection in progress + mListView.setChoiceMode(AbsListView.CHOICE_MODE_NONE); + mGridView.setChoiceMode(AbsListView.CHOICE_MODE_NONE); } @Override @@ -291,6 +295,11 @@ public class DirectoryFragment extends Fragment { updateDisplayState(); + // When launched into empty recents, show drawer + if (mType == TYPE_RECENT_OPEN && mAdapter.isEmpty() && !state.stackTouched) { + ((DocumentsActivity) context).setRootsDrawerOpen(true); + } + // Restore any previous instance state final SparseArray<Parcelable> container = state.dirState.remove(mStateKey); if (container != null && !getArguments().getBoolean(EXTRA_IGNORE_STATE, false)) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java index 39541731eda5..05766f5409d4 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java @@ -109,6 +109,11 @@ public class RecentsCreateFragment extends Fragment { public void onLoadFinished( Loader<List<DocumentStack>> loader, List<DocumentStack> data) { mAdapter.swapStacks(data); + + // When launched into empty recents, show drawer + if (mAdapter.isEmpty() && !state.stackTouched) { + ((DocumentsActivity) context).setRootsDrawerOpen(true); + } } @Override diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index bad0a9605a1b..eb5676509840 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -21,9 +21,11 @@ import static com.android.documentsui.DocumentsActivity.TAG; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; @@ -158,6 +160,9 @@ public class RootsCache { private class UpdateTask extends AsyncTask<Void, Void, Void> { private final String mFilterPackage; + private final Multimap<String, RootInfo> mTaskRoots = ArrayListMultimap.create(); + private final HashSet<String> mTaskStoppedAuthorities = Sets.newHashSet(); + /** * Update all roots. */ @@ -177,54 +182,64 @@ public class RootsCache { protected Void doInBackground(Void... params) { final long start = SystemClock.elapsedRealtime(); - final Multimap<String, RootInfo> roots = ArrayListMultimap.create(); - final HashSet<String> stoppedAuthorities = Sets.newHashSet(); - - roots.put(mRecentsRoot.authority, mRecentsRoot); + mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot); final ContentResolver resolver = mContext.getContentResolver(); final PackageManager pm = mContext.getPackageManager(); - final List<ProviderInfo> providers = pm.queryContentProviders( + + // Pick up provider with action string + final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE); + final List<ResolveInfo> providers = pm.queryIntentContentProviders(intent, 0); + for (ResolveInfo info : providers) { + handleDocumentsProvider(info.providerInfo); + } + + // Pick up legacy providers + final List<ProviderInfo> legacyProviders = pm.queryContentProviders( null, -1, PackageManager.GET_META_DATA); - for (ProviderInfo info : providers) { + for (ProviderInfo info : legacyProviders) { if (info.metaData != null && info.metaData.containsKey( DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) { - // Ignore stopped packages for now; we might query them - // later during UI interaction. - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) { - if (LOGD) Log.d(TAG, "Ignoring stopped authority " + info.authority); - stoppedAuthorities.add(info.authority); - continue; - } - - // Try using cached roots if filtering - boolean cacheHit = false; - if (mFilterPackage != null && !mFilterPackage.equals(info.packageName)) { - synchronized (mLock) { - if (roots.putAll(info.authority, mRoots.get(info.authority))) { - if (LOGD) Log.d(TAG, "Used cached roots for " + info.authority); - cacheHit = true; - } - } - } - - // Cache miss, or loading everything - if (!cacheHit) { - roots.putAll( - info.authority, loadRootsForAuthority(resolver, info.authority)); - } + handleDocumentsProvider(info); } } final long delta = SystemClock.elapsedRealtime() - start; - Log.d(TAG, "Update found " + roots.size() + " roots in " + delta + "ms"); + Log.d(TAG, "Update found " + mTaskRoots.size() + " roots in " + delta + "ms"); synchronized (mLock) { - mStoppedAuthorities = stoppedAuthorities; - mRoots = roots; + mRoots = mTaskRoots; + mStoppedAuthorities = mTaskStoppedAuthorities; } mFirstLoad.countDown(); return null; } + + private void handleDocumentsProvider(ProviderInfo info) { + // Ignore stopped packages for now; we might query them + // later during UI interaction. + if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) { + if (LOGD) Log.d(TAG, "Ignoring stopped authority " + info.authority); + mTaskStoppedAuthorities.add(info.authority); + return; + } + + // Try using cached roots if filtering + boolean cacheHit = false; + if (mFilterPackage != null && !mFilterPackage.equals(info.packageName)) { + synchronized (mLock) { + if (mTaskRoots.putAll(info.authority, mRoots.get(info.authority))) { + if (LOGD) Log.d(TAG, "Used cached roots for " + info.authority); + cacheHit = true; + } + } + } + + // Cache miss, or loading everything + if (!cacheHit) { + mTaskRoots.putAll(info.authority, + loadRootsForAuthority(mContext.getContentResolver(), info.authority)); + } + } } /** diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index 2fb12bb29233..fdbc3abf6187 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -142,9 +142,12 @@ public class RootsFragment extends Fragment { final RootInfo root = ((DocumentsActivity) getActivity()).getCurrentRoot(); for (int i = 0; i < mAdapter.getCount(); i++) { final Object item = mAdapter.getItem(i); - if (Objects.equal(item, root)) { - mList.setItemChecked(i, true); - return; + if (item instanceof RootItem) { + final RootInfo testRoot = ((RootItem) item).root; + if (Objects.equal(testRoot, root)) { + mList.setItemChecked(i, true); + return; + } } } } diff --git a/packages/ExternalStorageProvider/AndroidManifest.xml b/packages/ExternalStorageProvider/AndroidManifest.xml index 7094efc375b6..99a42600cc5a 100644 --- a/packages/ExternalStorageProvider/AndroidManifest.xml +++ b/packages/ExternalStorageProvider/AndroidManifest.xml @@ -11,9 +11,9 @@ android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> - <meta-data - android:name="android.content.DOCUMENT_PROVIDER" - android:value="true" /> + <intent-filter> + <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> + </intent-filter> </provider> <!-- TODO: find a better place for tests to live --> @@ -24,9 +24,9 @@ android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS" android:enabled="false"> - <meta-data - android:name="android.content.DOCUMENT_PROVIDER" - android:value="true" /> + <intent-filter> + <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> + </intent-filter> </provider> </application> </manifest> diff --git a/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..2d79280c7d55 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..543cb852769b --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..449705852693 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png Binary files differnew file mode 100644 index 000000000000..ba778995f9ea --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png Binary files differnew file mode 100644 index 000000000000..539ee2253558 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png Binary files differnew file mode 100644 index 000000000000..9a4ea2f481eb --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png Binary files differnew file mode 100644 index 000000000000..e6b11ded6d66 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png Binary files differnew file mode 100644 index 000000000000..822e8d113d0e --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png Binary files differnew file mode 100644 index 000000000000..be4253ec0497 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..2334e143c1d8 --- /dev/null +++ b/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..ff404337beb1 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..d5f874df2860 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..f027007e0e54 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png Binary files differnew file mode 100644 index 000000000000..981facd14221 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png Binary files differnew file mode 100644 index 000000000000..d432f42c952b --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png Binary files differnew file mode 100644 index 000000000000..7bb749ed8f9b --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png Binary files differnew file mode 100644 index 000000000000..43d826e7f111 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png Binary files differnew file mode 100644 index 000000000000..98ac4287f697 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png Binary files differnew file mode 100644 index 000000000000..d8b563bc9c26 --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..47c5dd95117a --- /dev/null +++ b/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..dff09393606a --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..60b81984cf88 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..11b31be3083d --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png Binary files differnew file mode 100644 index 000000000000..ffe913d0c287 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png Binary files differnew file mode 100644 index 000000000000..2fccb8f0c5f9 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png Binary files differnew file mode 100644 index 000000000000..a63850143408 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png Binary files differnew file mode 100644 index 000000000000..f0e65ea1e968 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png Binary files differnew file mode 100644 index 000000000000..04f6ae326a60 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png Binary files differnew file mode 100644 index 000000000000..7fef98dd7911 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..a7121697a3e9 --- /dev/null +++ b/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png Binary files differnew file mode 100644 index 000000000000..0c0838b0773a --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..60a8e22f892a --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..18384d39f326 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..82eb6155c178 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png Binary files differnew file mode 100644 index 000000000000..d1ac7ae17be6 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png Binary files differnew file mode 100644 index 000000000000..58a2976f51fe --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png Binary files differnew file mode 100644 index 000000000000..6f696fd80e94 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png Binary files differnew file mode 100644 index 000000000000..faae4e37340e --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png Binary files differnew file mode 100644 index 000000000000..82c2b7eeb889 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png Binary files differnew file mode 100644 index 000000000000..800d95e54d27 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..9991f7fc0834 --- /dev/null +++ b/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png diff --git a/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml b/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml new file mode 100644 index 000000000000..d09b1a516664 --- /dev/null +++ b/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source 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:drawable="@drawable/scrubber_control_disabled_holo" /> + <item android:state_pressed="true" android:drawable="@drawable/scrubber_control_pressed_holo" /> + <item android:state_selected="true" android:drawable="@drawable/scrubber_control_focused_holo" /> + <item android:drawable="@drawable/scrubber_control_normal_holo" /> +</selector> diff --git a/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml b/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml new file mode 100644 index 000000000000..f07c7420054c --- /dev/null +++ b/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source 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. +--> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@android:id/background" + android:drawable="@drawable/scrubber_track_holo_light" /> + <item android:id="@android:id/secondaryProgress"> + <scale android:scaleWidth="100%" + android:drawable="@drawable/scrubber_secondary_holo" /> + </item> + <item android:id="@android:id/progress"> + <scale android:scaleWidth="100%" + android:drawable="@drawable/scrubber_primary_holo" /> + </item> +</layer-list> diff --git a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml b/packages/Keyguard/res/layout/keyguard_transport_control_view.xml index 81c742504948..a0b59a7dfb0c 100644 --- a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml +++ b/packages/Keyguard/res/layout/keyguard_transport_control_view.xml @@ -75,7 +75,8 @@ <SeekBar android:id="@+id/transient_seek_bar" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + style="@style/Widget.TransportControl.SeekBar" /> <TextView android:id="@+id/transient_seek_time_elapsed" android:layout_width="wrap_content" diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml index 57125bdb9690..fa778b3293b2 100644 --- a/packages/Keyguard/res/values-ar/strings.xml +++ b/packages/Keyguard/res/values-ar/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"زر الإيقاف المؤقت"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"زر التشغيل"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"زر الإيقاف"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رائعة"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"معارضة"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"إلغاء القفل للمتابعة"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"تم إلغاء التشغيل"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"أسقط <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> للحذف."</string> diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml index 23478c71bd85..468570f3f483 100644 --- a/packages/Keyguard/res/values-bg/strings.xml +++ b/packages/Keyguard/res/values-bg/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Бутон за пауза"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Бутон за пускане"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Бутон за спиране"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Харесва ми"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не ми харесва"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Сърце"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Отключете, за да продължите"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Стартирането е анулирано"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Пуснете <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, за да изтриете."</string> diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml index 8349703a10a7..b4598cbb3045 100644 --- a/packages/Keyguard/res/values-cs/strings.xml +++ b/packages/Keyguard/res/values-cs/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačítko Pozastavit"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačítko Přehrát"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačítko Zastavit"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Líbí se mi"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nelíbí se mi"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdíčko"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Pokračujte odemknutím"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spuštění zrušeno"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvolněním dotyku widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vymažete."</string> diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index 7f94f63afa85..0cff37cf642f 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knap"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Afspil-knap"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knap"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Synes om"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Synes ikke om"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås op for at gå videre"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten blev annulleret"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slip <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for at slette."</string> diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml index 3ab8ff5b2530..892bab73e1f8 100644 --- a/packages/Keyguard/res/values-en-rGB/strings.xml +++ b/packages/Keyguard/res/values-en-rGB/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string> diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml index 3ab8ff5b2530..892bab73e1f8 100644 --- a/packages/Keyguard/res/values-en-rIN/strings.xml +++ b/packages/Keyguard/res/values-en-rIN/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string> diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml index bafd66d9517b..2278efd5a4ab 100644 --- a/packages/Keyguard/res/values-es-rUS/strings.xml +++ b/packages/Keyguard/res/values-es-rUS/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón de detención"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Votos a favor"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Votos en contra"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquea para continuar."</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Se canceló el inicio."</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string> diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml index e0eb1e1b4891..4b0bce5bb290 100644 --- a/packages/Keyguard/res/values-fa/strings.xml +++ b/packages/Keyguard/res/values-fa/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"دکمه توقف موقت"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"دکمه پخش"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"دکمه توقف"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رأی موافق"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"رأی مخالف"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"برای ادامه قفل را باز کنید"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"راهاندازی لغو شد"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"جهت حذف، <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> را بکشید."</string> diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml index a719610522a5..68d8227543b5 100644 --- a/packages/Keyguard/res/values-fi/strings.xml +++ b/packages/Keyguard/res/values-fi/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tauko-painike"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Toista-painike"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Keskeytä-painike"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tykkään"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"En tykkää"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sydän"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jatka poistamalla lukitus"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käynnistys peruutettu"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Poista <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pudottamalla."</string> diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml index 1251f4bff41f..8d07cfd442ab 100644 --- a/packages/Keyguard/res/values-fr-rCA/strings.xml +++ b/packages/Keyguard/res/values-fr-rCA/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouiller pour continuer"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Déposez <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pour supprimer."</string> diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml index cb78f8d5a2b8..37fb8fbe103a 100644 --- a/packages/Keyguard/res/values-fr/strings.xml +++ b/packages/Keyguard/res/values-fr/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouillez l\'appareil pour continuer."</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé."</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Relâchez le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" pour le supprimer."</string> diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml index 304f14f8f1ff..058a2f77a0ed 100644 --- a/packages/Keyguard/res/values-hi/strings.xml +++ b/packages/Keyguard/res/values-hi/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"पॉज़ करें बटन"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"चलाएं बटन"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"रोकें बटन"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"पसंद"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"नापसंद"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"दिल"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"जारी रखने के लिए अनलॉक करें"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"लॉन्च रद्द कर दिया गया"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"हटाने के लिए <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> खींचें."</string> diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml index 073c4caa5d92..99270a918ccf 100644 --- a/packages/Keyguard/res/values-hr/strings.xml +++ b/packages/Keyguard/res/values-hr/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb Pauza"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb Reprodukcija"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb Zaustavi"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Palac gore"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Palac dolje"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Otključajte za nastavak"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pokretanje je otkazano"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ispustite widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> da biste ga izbrisali."</string> diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml index db22282310d2..2c10d39d1da3 100644 --- a/packages/Keyguard/res/values-hy-rAM/strings.xml +++ b/packages/Keyguard/res/values-hy-rAM/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Դադարի կոճակ"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Նվագարկման կոճակ"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Կանգի կոճակ"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Լավն է"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Լավը չէ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Սիրտ"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Շարունակելու համար ապակողպեք"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Գործարկումը չեղարկվեց"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթը ջնջելու համար բաց թողեք այն այստեղ:"</string> diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml index 380c34e3e7ef..3b2de3d206c1 100644 --- a/packages/Keyguard/res/values-in/strings.xml +++ b/packages/Keyguard/res/values-in/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tombol jeda"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tombol putar"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tombol hentikan"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bagus"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Jelek"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hati"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk melanjutkan"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Peluncuran dibatalkan"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk menghapus."</string> diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml index 1b19110b80ce..c7e0447386a6 100644 --- a/packages/Keyguard/res/values-ja/strings.xml +++ b/packages/Keyguard/res/values-ja/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"一時停止ボタン"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"再生ボタン"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止ボタン"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"グッド"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"イマイチ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ハート"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"続行するにはロックを解除してください"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"起動をキャンセルしました"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"削除するには<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>をドロップしてください。"</string> diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml index f1fabba337b8..f643178025f1 100644 --- a/packages/Keyguard/res/values-ka-rGE/strings.xml +++ b/packages/Keyguard/res/values-ka-rGE/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"პაუზის ღილაკი"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"დაკვრის ღილაკი"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop ღილაკი"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ზევით აწეული ცერი"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ქვევით დახრილი ცერი"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"გული"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"განბლოკეთ გასაგრძელებლად"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"გამოძახება გაუქმდა"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ჩააგდეთ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წასაშლელად."</string> diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml index c88279ba908c..75cebac66243 100644 --- a/packages/Keyguard/res/values-km-rKH/strings.xml +++ b/packages/Keyguard/res/values-km-rKH/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ប៊ូតុងផ្អាក"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ប៊ូតុងចាក់"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ប៊ូតុងបញ្ឈប់"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"មេដៃឡើង"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"មេដៃចុះ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"បេះដូង"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ដោះសោ ដើម្បីបន្ត"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"បានបោះបង់ការចាប់ផ្ដើម"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ទម្លាក់ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ដើម្បីលុប។"</string> diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml index e01a2e19a5e3..a1b50962cf0c 100644 --- a/packages/Keyguard/res/values-ko/strings.xml +++ b/packages/Keyguard/res/values-ko/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"일시중지 버튼"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"재생 버튼"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"중지 버튼"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"좋아요"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"싫어요"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"하트"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"계속하려면 잠금해제합니다."</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"실행 취소됨"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"삭제하려면 <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>을(를) 드롭합니다."</string> diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml index 94d27770fc40..a9ba8ba9eb79 100644 --- a/packages/Keyguard/res/values-lo-rLA/strings.xml +++ b/packages/Keyguard/res/values-lo-rLA/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ປຸ່ມຫຼິ້ນ"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ປຸ່ມຢຸດ"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ເລື່ອນນິ້ວໂປ້ຂຶ້ນ"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ເລື່ອນນິ້ວໂປ້ລົງ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ຫົວໃຈ"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ປົດລັອກເພື່ອດຳເນີນການຕໍ່"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ການເປີດໃຊ້ຖືກຍົກເລີກ"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ວາງ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ເພື່ອລຶບ."</string> diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml index 82a9e5815a92..e4c07eb428a0 100644 --- a/packages/Keyguard/res/values-mn-rMN/strings.xml +++ b/packages/Keyguard/res/values-mn-rMN/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Түр зогсоох товч"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Тоглуулах товч"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Зогсоох товч"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Сайн"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Онцгүй"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Зүрх"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Үргэлжлүүлэхийн тулд түгжээг тайлна уу"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Эхлүүлэхийг цуцалсан"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Устгахын тулд <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-г тавина уу."</string> diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml index 75213fe90c84..17ec2e6197e3 100644 --- a/packages/Keyguard/res/values-ms-rMY/strings.xml +++ b/packages/Keyguard/res/values-ms-rMY/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butang jeda"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butang main"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butang berhenti"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Menyukai"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tidak diterima"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Jantung"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk meneruskan"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pelancaran dibatalkan"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk memadam."</string> diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml index bf66a993ffb7..3c668a024e68 100644 --- a/packages/Keyguard/res/values-pt/strings.xml +++ b/packages/Keyguard/res/values-pt/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão \"Pausar\""</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão \"Reproduzir\""</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão \"Parar\""</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gostei"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gostei"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueie para continuar"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicialização cancelada"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Solte <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para excluir."</string> diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml index 194861ac6769..cebf0df9f451 100644 --- a/packages/Keyguard/res/values-ro/strings.xml +++ b/packages/Keyguard/res/values-ro/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butonul Întrerupeți"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butonul Redați"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butonul Opriți"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Vot pozitiv"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Vot negativ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inimă"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Deblocați pentru a continua"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lansare anulată"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Eliberați <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pentru a șterge."</string> diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml index 2d57be61639b..d8a457df90a1 100644 --- a/packages/Keyguard/res/values-ru/strings.xml +++ b/packages/Keyguard/res/values-ru/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка паузы"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка воспроизведения"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка выключения"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Нравится"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не нравится"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Разблокируйте экран, чтобы продолжить."</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск отменен."</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\", чтобы удалить его."</string> diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml index 8711cb9b0831..bd3f058b3803 100644 --- a/packages/Keyguard/res/values-sk/strings.xml +++ b/packages/Keyguard/res/values-sk/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačidlo Pozastaviť"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačidlo Prehrať"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačidlo Zastaviť"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Páči sa mi"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepáči sa mi"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdce"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odomknite zariadenie a pokračujte"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spustenie bolo zrušené"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvoľnením dotyku miniaplikáciu <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> odstránite."</string> diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml index d7759a86a92b..7e7d89331589 100644 --- a/packages/Keyguard/res/values-sl/strings.xml +++ b/packages/Keyguard/res/values-sl/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb za začasno ustavitev"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb za predvajanje"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Všeč mi je"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ni mi všeč"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string> diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml index 19bc74eaf3d6..c5cc39cc888f 100644 --- a/packages/Keyguard/res/values-sr/strings.xml +++ b/packages/Keyguard/res/values-sr/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Дугме за паузу"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Дугме за репродукцију"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Дугме за заустављање"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Свиђа ми се"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не свиђа ми се"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Срце"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Откључајте да бисте наставили"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Покретање је отказано"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> да бисте га избрисали."</string> diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml index 834758826f50..dd82711dffaa 100644 --- a/packages/Keyguard/res/values-sv/strings.xml +++ b/packages/Keyguard/res/values-sv/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pausknappen"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Uppspelningsknappen"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stoppknappen"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gillar"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tummen ned"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjärta"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås upp om du vill fortsätta"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lanseringen har avbrutits"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ta bort genom att släppa <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> här."</string> diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml index aea2e216768a..5e2b163dc344 100644 --- a/packages/Keyguard/res/values-sw/strings.xml +++ b/packages/Keyguard/res/values-sw/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Kitufe cha kusitisha"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Kitufe cha kucheza"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Kitufe cha kusitisha"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bomba"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Si bomba"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Moyo"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Fungua ili uendelee"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uzinduzi umeghairiwa"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Dondosha <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ili ufute."</string> diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml index 8d80977ce043..3f2c74760ceb 100644 --- a/packages/Keyguard/res/values-th/strings.xml +++ b/packages/Keyguard/res/values-th/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ปุ่มหยุดชั่วคราว"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ปุ่มเล่น"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ปุ่มหยุด"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"สุดยอด"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ไม่ชอบ"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"หัวใจ"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ปลดล็อกเพื่อดำเนินการต่อ"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ยกเลิกการเปิดใช้งานแล้ว"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ลาก <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> เพื่อลบ"</string> diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml index 67d26cb8aa53..3a33c9f92df4 100644 --- a/packages/Keyguard/res/values-tl/strings.xml +++ b/packages/Keyguard/res/values-tl/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Button na I-pause"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Button na I-play"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Button na Ihinto"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"I-unlock upang magpatuloy"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Nakansela ang paglunsad"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"I-drop ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> upang tanggalin."</string> diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml index 71356dc732ff..d9c950f70801 100644 --- a/packages/Keyguard/res/values-tr/strings.xml +++ b/packages/Keyguard/res/values-tr/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Duraklat düğmesi"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oynat düğmesi"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Durdur düğmesi"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Beğen"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Beğenme"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Kalp"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Devam etmek için kilidini açın"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Başlatma iptal edildi"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Silmek için <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ını bırakın."</string> diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml index 3c004ce03905..01bf6878a2ab 100644 --- a/packages/Keyguard/res/values-uk/strings.xml +++ b/packages/Keyguard/res/values-uk/strings.xml @@ -73,7 +73,7 @@ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка \"Зупинити\""</string> <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Подобається"</string> <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не подобається"</string> - <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Серце"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Розблокуйте, щоб продовжити"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск скасовано"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Відпустіть <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, щоб видалити."</string> diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml index d5e52d719d8c..6ae8312bffa7 100644 --- a/packages/Keyguard/res/values-vi/strings.xml +++ b/packages/Keyguard/res/values-vi/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nút tạm dừng"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nút phát"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nút dừng"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bài hát được đánh dấu thích"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Bài hát được đánh dấu không thích"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Trái tim"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Mở khóa để tiếp tục"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Quá trình khởi chạy bị hủy"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Thả <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> để xóa."</string> diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index a62ffac7f9e7..06d71fff0043 100644 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"暂停按钮"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"播放按钮"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止按钮"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"我喜欢"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜欢"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"爱心"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"解锁即可继续"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"启动已取消"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"放下<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>即可将其删除。"</string> diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml index b4238e168026..724357f914a0 100644 --- a/packages/Keyguard/res/values-zh-rHK/strings.xml +++ b/packages/Keyguard/res/values-zh-rHK/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"心形"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"請解鎖以繼續"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可刪除。"</string> diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml index 01702f893d18..f3f172497260 100644 --- a/packages/Keyguard/res/values-zh-rTW/strings.xml +++ b/packages/Keyguard/res/values-zh-rTW/strings.xml @@ -71,12 +71,9 @@ <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string> <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string> <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string> - <!-- no translation found for keyguard_accessibility_transport_thumbs_up_description (4535938129663903194) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_thumbs_down_description (8101433677192177861) --> - <skip /> - <!-- no translation found for keyguard_accessibility_transport_heart_description (2336943232474689887) --> - <skip /> + <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string> + <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string> + <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"愛心"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖才能繼續操作"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string> <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string> diff --git a/packages/Keyguard/res/values/alias.xml b/packages/Keyguard/res/values/alias.xml index b22311e78a9f..e6657a18d76c 100644 --- a/packages/Keyguard/res/values/alias.xml +++ b/packages/Keyguard/res/values/alias.xml @@ -43,8 +43,8 @@ <!-- Alias used to reference framework configuration for screen rotation. --> <item type="bool" name="config_enableLockScreenRotation">@*android:bool/config_enableLockScreenRotation</item> - <!-- Alias used to reference framework configuration for transparent bars. --> - <item type="bool" name="config_enableLockScreenTransparentBars">@*android:bool/config_enableLockScreenTransparentBars</item> + <!-- Alias used to reference framework configuration for translucent decor. --> + <item type="bool" name="config_enableLockScreenTranslucentDecor">@*android:bool/config_enableLockScreenTranslucentDecor</item> <!-- Alias used to reference framework activity duration. --> <item type="integer" name="config_activityDefaultDur">@*android:integer/config_activityDefaultDur</item> diff --git a/packages/Keyguard/res/values/styles.xml b/packages/Keyguard/res/values/styles.xml index 44f560fe2c87..9fd8f31b2d3b 100644 --- a/packages/Keyguard/res/values/styles.xml +++ b/packages/Keyguard/res/values/styles.xml @@ -68,4 +68,18 @@ <item name="android:textSize">@dimen/widget_big_font_size</item> </style> + <style name="Widget.TransportControl.SeekBar" parent="@android:style/Widget.Holo.SeekBar"> + <item name="android:indeterminateOnly">false</item> + <item name="android:progressDrawable">@drawable/scrubber_progress_horizontal_holo_light</item> + <item name="android:indeterminateDrawable">@drawable/scrubber_progress_horizontal_holo_light</item> + <item name="android:minHeight">13dip</item> + <item name="android:maxHeight">13dip</item> + <item name="android:thumb">@drawable/scrubber_control_selector_holo</item> + <item name="android:thumbOffset">16dip</item> + <item name="android:focusable">true</item> + <item name="android:paddingStart">16dip</item> + <item name="android:paddingEnd">16dip</item> + <item name="android:mirrorForRtl">true</item> + </style> + </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java index 03b09b131524..c33f17477b46 100644 --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -47,6 +47,14 @@ public class CarrierText extends TextView { mSimState = simState; updateCarrierText(mSimState, mPlmn, mSpn); } + + public void onScreenTurnedOff(int why) { + setSelected(false); + }; + + public void onScreenTurnedOn() { + setSelected(true); + }; }; /** * The status of this lock screen. Primarily used for widgets on LockScreen. @@ -79,7 +87,8 @@ public class CarrierText extends TextView { protected void onFinishInflate() { super.onFinishInflate(); mSeparator = getResources().getString(R.string.kg_text_message_separator); - setSelected(true); // Allow marquee to work. + final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + setSelected(screenOn); // Allow marquee to work. } @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java index ad59c0267ce7..69075ec3d03a 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardMessageArea.java @@ -163,6 +163,12 @@ class KeyguardMessageArea extends TextView { mBatteryIsLow = status.isBatteryLow(); update(); } + public void onScreenTurnedOff(int why) { + setSelected(false); + }; + public void onScreenTurnedOn() { + setSelected(true); + }; }; public KeyguardMessageArea(Context context) { @@ -174,9 +180,6 @@ class KeyguardMessageArea extends TextView { mLockPatternUtils = new LockPatternUtils(context); - // This is required to ensure marquee works - setSelected(true); - // Registering this callback immediately updates the battery state, among other things. mUpdateMonitor = KeyguardUpdateMonitor.getInstance(getContext()); mUpdateMonitor.registerCallback(mInfoCallback); @@ -187,6 +190,12 @@ class KeyguardMessageArea extends TextView { update(); } + @Override + protected void onFinishInflate() { + final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + setSelected(screenOn); // This is required to ensure marquee works + } + public void securityMessageChanged() { setAlpha(1f); mShowingMessage = true; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index ffb619bda4da..3e42c14b2f69 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -21,6 +21,7 @@ import android.content.res.Resources; import android.graphics.Typeface; import android.text.TextUtils; import android.util.AttributeSet; +import android.util.Log; import android.util.Slog; import android.view.View; import android.widget.GridLayout; @@ -56,6 +57,14 @@ public class KeyguardStatusView extends GridLayout { refresh(); } }; + + public void onScreenTurnedOn() { + setEnableMarquee(true); + }; + + public void onScreenTurnedOff(int why) { + setEnableMarquee(false); + }; }; public KeyguardStatusView(Context context) { @@ -70,22 +79,18 @@ public class KeyguardStatusView extends GridLayout { super(context, attrs, defStyle); } + private void setEnableMarquee(boolean enabled) { + if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee"); + if (mAlarmStatusView != null) mAlarmStatusView.setSelected(enabled); + } + @Override protected void onFinishInflate() { super.onFinishInflate(); - mAlarmStatusView = (TextView) findViewById(R.id.alarm_status); mLockPatternUtils = new LockPatternUtils(getContext()); - - // Required to get Marquee to work. - final View marqueeViews[] = { mAlarmStatusView }; - for (int i = 0; i < marqueeViews.length; i++) { - View v = marqueeViews[i]; - if (v == null) { - throw new RuntimeException("Can't find widget at index " + i); - } - v.setSelected(true); - } + final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + setEnableMarquee(screenOn); refresh(); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java index 83d8ab127435..ca4892dee32f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java @@ -22,6 +22,8 @@ import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.MediaMetadataEditor; @@ -63,7 +65,7 @@ public class KeyguardTransportControlView extends FrameLayout { protected static final boolean DEBUG = false; protected static final String TAG = "TransportControlView"; - private static final boolean ANIMATE_TRANSITIONS = false; + private static final boolean ANIMATE_TRANSITIONS = true; private ViewGroup mMetadataContainer; private ViewGroup mInfoContainer; @@ -198,13 +200,22 @@ public class KeyguardTransportControlView extends FrameLayout { KeyguardHostView.TransportControlCallback mTransportControlCallback; + private final KeyguardUpdateMonitorCallback mUpdateMonitor + = new KeyguardUpdateMonitorCallback() { + public void onScreenTurnedOff(int why) { + setEnableMarquee(false); + }; + public void onScreenTurnedOn() { + setEnableMarquee(true); + }; + }; + public KeyguardTransportControlView(Context context, AttributeSet attrs) { super(context, attrs); if (DEBUG) Log.v(TAG, "Create TCV " + this); mAudioManager = new AudioManager(mContext); mCurrentPlayState = RemoteControlClient.PLAYSTATE_NONE; // until we get a callback - mRemoteController = new RemoteController(context); - mRemoteController.setOnClientUpdateListener(mRCClientUpdateListener); + mRemoteController = new RemoteController(context, mRCClientUpdateListener); final DisplayMetrics dm = context.getResources().getDisplayMetrics(); final int dim = Math.max(dm.widthPixels, dm.heightPixels); @@ -251,6 +262,12 @@ public class KeyguardTransportControlView extends FrameLayout { mTransportControlCallback = transportControlCallback; } + private void setEnableMarquee(boolean enabled) { + if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee"); + if (mTrackTitle != null) mTrackTitle.setSelected(enabled); + if (mTrackArtistAlbum != null) mTrackTitle.setSelected(enabled); + } + @Override public void onFinishInflate() { super.onFinishInflate(); @@ -258,9 +275,7 @@ public class KeyguardTransportControlView extends FrameLayout { mMetadataContainer = (ViewGroup) findViewById(R.id.metadata_container); mBadge = (ImageView) findViewById(R.id.badge); mTrackTitle = (TextView) findViewById(R.id.title); - mTrackTitle.setSelected(true); // enable marquee mTrackArtistAlbum = (TextView) findViewById(R.id.artist_album); - mTrackArtistAlbum.setSelected(true); mTransientSeek = findViewById(R.id.transient_seek); mTransientSeekBar = (SeekBar) findViewById(R.id.transient_seek_bar); mTransientSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangeListener); @@ -274,6 +289,8 @@ public class KeyguardTransportControlView extends FrameLayout { view.setOnClickListener(mTransportCommandListener); view.setOnLongClickListener(mTransportShowSeekBarListener); } + final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn(); + setEnableMarquee(screenOn); } @Override @@ -286,6 +303,7 @@ public class KeyguardTransportControlView extends FrameLayout { } if (DEBUG) Log.v(TAG, "Registering TCV " + this); mAudioManager.registerRemoteController(mRemoteController); + KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitor); } @Override @@ -302,6 +320,7 @@ public class KeyguardTransportControlView extends FrameLayout { super.onDetachedFromWindow(); if (DEBUG) Log.v(TAG, "Unregistering TCV " + this); mAudioManager.unregisterRemoteController(mRemoteController); + KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitor); mUserSeeking = false; } @@ -311,6 +330,7 @@ public class KeyguardTransportControlView extends FrameLayout { final ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); mBadge.setColorFilter(new ColorMatrixColorFilter(cm)); + mBadge.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); mBadge.setImageAlpha(0xef); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 734f51714be6..45cd3d4bcd2a 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -92,7 +92,8 @@ public class KeyguardUpdateMonitor { protected static final int MSG_SET_PLAYBACK_STATE = 316; protected static final int MSG_USER_INFO_CHANGED = 317; protected static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318; - + private static final int MSG_SCREEN_TURNED_ON = 319; + private static final int MSG_SCREEN_TURNED_OFF = 320; private static KeyguardUpdateMonitor sInstance; @@ -127,6 +128,8 @@ public class KeyguardUpdateMonitor { private boolean mSwitchingUser; + private boolean mScreenOn; + private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -185,6 +188,12 @@ public class KeyguardUpdateMonitor { case MSG_REPORT_EMERGENCY_CALL_ACTION: handleReportEmergencyCallAction(); break; + case MSG_SCREEN_TURNED_OFF: + handleScreenTurnedOff(msg.arg1); + break; + case MSG_SCREEN_TURNED_ON: + handleScreenTurnedOn(); + break; } } }; @@ -232,6 +241,10 @@ public class KeyguardUpdateMonitor { } + public void setEnabled(boolean enabled) { + // no-op: this RemoteControlDisplay is not subject to being disabled. + } + public void setCurrentClientId(int clientGeneration, PendingIntent mediaIntent, boolean clearing) throws RemoteException { Message msg = mHandler.obtainMessage(MSG_SET_CURRENT_CLIENT_ID, @@ -407,6 +420,26 @@ public class KeyguardUpdateMonitor { return sInstance; } + protected void handleScreenTurnedOn() { + final int count = mCallbacks.size(); + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onScreenTurnedOn(); + } + } + } + + protected void handleScreenTurnedOff(int arg1) { + final int count = mCallbacks.size(); + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onScreenTurnedOff(arg1); + } + } + } + /** * IMPORTANT: Must be called from UI thread. */ @@ -1037,4 +1070,24 @@ public class KeyguardUpdateMonitor { public DisplayClientState getCachedDisplayClientState() { return mDisplayClientState; } + + // TODO: use these callbacks elsewhere in place of the existing notifyScreen*() + // (KeyguardViewMediator, KeyguardHostView) + public void dispatchScreenTurnedOn() { + synchronized (this) { + mScreenOn = true; + } + mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON); + } + + public void dispatchScreenTurndOff(int why) { + synchronized(this) { + mScreenOn = false; + } + mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREEN_TURNED_OFF, why, 0)); + } + + public boolean isScreenOn() { + return mScreenOn; + } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index e6dddab148f8..76f963733c98 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -19,6 +19,7 @@ import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; import android.graphics.Bitmap; import android.media.AudioManager; +import android.view.WindowManagerPolicy; import com.android.internal.telephony.IccCardConstants; @@ -137,7 +138,23 @@ class KeyguardUpdateMonitorCallback { */ void onEmergencyCallAction() { } + /** + * Called when the transport background changes. + * @param bitmap + */ public void onSetBackground(Bitmap bitmap) { - // THIS SPACE FOR RENT } + + /** + * Called when the screen turns on + */ + public void onScreenTurnedOn() { } + + /** + * Called when the screen turns off + * @param why {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, + * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or + * {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}. + */ + public void onScreenTurnedOff(int why) { } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java index 2084a168cfe7..65841805ee31 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewManager.java @@ -124,9 +124,9 @@ public class KeyguardViewManager { // activities. Other disabled bits are handled by the KeyguardViewMediator talking // directly to the status bar service. int visFlags = View.STATUS_BAR_DISABLE_HOME; - if (shouldEnableTransparentBars()) { - visFlags |= View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; + if (shouldEnableTranslucentDecor()) { + mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; } if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")"); mKeyguardHost.setSystemUiVisibility(visFlags); @@ -143,9 +143,9 @@ public class KeyguardViewManager { || res.getBoolean(R.bool.config_enableLockScreenRotation); } - private boolean shouldEnableTransparentBars() { + private boolean shouldEnableTranslucentDecor() { Resources res = mContext.getResources(); - return res.getBoolean(R.bool.config_enableLockScreenTransparentBars); + return res.getBoolean(R.bool.config_enableLockScreenTranslucentDecor); } class ViewManagerHost extends FrameLayout { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java index dc28bd09a84e..a37a3a440a7f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java @@ -599,6 +599,7 @@ public class KeyguardViewMediator { doKeyguardLocked(null); } } + KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurndOff(why); } private void doKeyguardLaterLocked() { @@ -664,6 +665,7 @@ public class KeyguardViewMediator { notifyScreenOnLocked(callback); } } + KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn(); maybeSendUserPresentBroadcast(); } diff --git a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java index 67d0d5a67d71..528f98834f36 100644 --- a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java +++ b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java @@ -79,7 +79,7 @@ public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayo final Resources res = getResources(); mDisplayMetrics = res.getDisplayMetrics(); - setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE); + setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } public void setInsets(Rect insets) { diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java index 9718c9bffb60..4f377a376c75 100644 --- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java +++ b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java @@ -260,7 +260,7 @@ public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout mChallengeBottomBound = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding); setWillNotDraw(false); - setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE); + setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } public void setInsets(Rect insets) { diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png Binary files differnew file mode 100644 index 000000000000..bb9d855f7769 --- /dev/null +++ b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png Binary files differnew file mode 100644 index 000000000000..bd611e8e24d2 --- /dev/null +++ b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png Binary files differnew file mode 100644 index 000000000000..a7fdc0dfcb1d --- /dev/null +++ b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml index 2792dcf17605..6fc77df16f28 100644 --- a/packages/PrintSpooler/res/layout/select_printer_activity.xml +++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml @@ -48,6 +48,7 @@ </ImageView> <TextView + android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" @@ -56,6 +57,7 @@ </TextView> <ProgressBar + android:id="@+id/progress_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:indeterminate="true" diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml index d4ce1cf17cb5..ee62f9f5e275 100644 --- a/packages/PrintSpooler/res/menu/select_printer_activity.xml +++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml @@ -21,14 +21,14 @@ android:title="@string/search" android:icon="@*android:drawable/ic_menu_search_holo_light" android:actionViewClass="android.widget.SearchView" - android:showAsAction="ifRoom" + android:showAsAction="ifRoom|collapseActionView" android:alphabeticShortcut="f" android:imeOptions="actionSearch"> </item> <item android:id="@+id/action_add_printer" - android:title="@null" + android:title="@string/print_add_printer" android:icon="@*android:drawable/create_contact" android:showAsAction="ifRoom" android:alphabeticShortcut="a"> diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml index 133dcfa2b88e..f307f2a69cdb 100644 --- a/packages/PrintSpooler/res/values-af/strings.xml +++ b/packages/PrintSpooler/res/values-af/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Drukvoorskou"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installeer PDF-bekyker vir voorskou"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Drukkerprogram het omgeval"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"onbeskikbaar"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Bladsye"</string> <string name="generating_print_job" msgid="3119608742651698916">"Genereer uitdruktaak"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Stoor as PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Alle drukkers…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Deursoek"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alle drukkers"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Voeg diens by"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Kies drukdiens"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Soek tans vir drukkers"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Druk tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kanselleer tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 1542bab31a57..49928750e4f2 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"የህትመት ቅድመ እይታ"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-እይታ የፒ ዲ ኤፍ መመልከቻ ይጫኑ"</string> <string name="printing_app_crashed" msgid="854477616686566398">"የአታሚ መተግበሪያ ተበላሽቷል"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"አይገኝም"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"የህትመት ስራን በማመንጨት ላይ"</string> <string name="save_as_pdf" msgid="5718454119847596853">"እንደ ፒ ዲ ኤፍ አስቀምጥ"</string> <string name="all_printers" msgid="5018829726861876202">"ሁሉም አታሚዎች…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"ፍለጋ"</string> <string name="all_printers_label" msgid="3178848870161526399">"ሁሉም አታሚዎች"</string> <string name="add_print_service_label" msgid="5356702546188981940">"አገልግሎት አክል"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"የህትመት አገልግሎት ይምረጡ"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በማተም ላይ"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በመተው ላይ"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"የአታሚ ስህተት <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index 042cda830a3f..03f62b8dfba2 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"معاينة قبل الطباعة"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"تثبيت برنامج عرض PDF للمعاينة"</string> <string name="printing_app_crashed" msgid="854477616686566398">"تعطّل تطبيق الطباعة"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"غير متوفر"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"جارٍ إنشاء مهمة الطباعة"</string> <string name="save_as_pdf" msgid="5718454119847596853">"حفظ بتنسيق PDF"</string> <string name="all_printers" msgid="5018829726861876202">"جميع الطابعات…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"بحث"</string> <string name="all_printers_label" msgid="3178848870161526399">"جميع الطابعات"</string> <string name="add_print_service_label" msgid="5356702546188981940">"إضافة خدمة"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"اختر خدمة طباعة"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"جارٍ طباعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"جارٍ إلغاء <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"خطا في الطابعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-be/donottranslate.xml b/packages/PrintSpooler/res/values-be/donottranslate.xml new file mode 100644 index 000000000000..7537aa50d20c --- /dev/null +++ b/packages/PrintSpooler/res/values-be/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + + <string name="mediasize_default">NA_LETTER</string> + <string name="mediasize_standard">@string/mediasize_standard_north_america</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml index c28cbf18f723..a4e8f5341050 100644 --- a/packages/PrintSpooler/res/values-bg/strings.xml +++ b/packages/PrintSpooler/res/values-bg/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Визуализация за печат"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Инсталиране на визуализатор на PDF"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Получи се срив в приложението за отпечатване"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"няма информация"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Заданието за печат се генерира"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Запазване като PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Всички принтери…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Търсене"</string> <string name="all_printers_label" msgid="3178848870161526399">"Всички принтери"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Добавяне на услуга"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Избиране на услуга за отпечатване"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се отпечатва"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се анулира"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка в принтера при „<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“"</string> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index 43859662932e..d7cc2134ecbf 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Visualització prèvia impressió"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instal·la un lector de PDF per a visualitz. prèvia"</string> <string name="printing_app_crashed" msgid="854477616686566398">"L\'aplicació d\'impressió ha fallat"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generant tasca impressió"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Desa com a PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Totes les impressores…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Cerca"</string> <string name="all_printers_label" msgid="3178848870161526399">"Totes les impressores"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Afegeix un servei"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Selecció del servei d\'impressió"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"S\'està imprimint <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"S\'està cancel·lant <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Error d\'impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml index 402c4671df1d..f435215e1610 100644 --- a/packages/PrintSpooler/res/values-cs/strings.xml +++ b/packages/PrintSpooler/res/values-cs/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Náhled tisku"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Nainstalovat prohlížeč PDF (umožní náhled)"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplikace tisku selhala"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nedostupné"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Stránky"</string> <string name="generating_print_job" msgid="3119608742651698916">"Generování úlohy tisku"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Uložit ve formátu PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Všechny tiskárny…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Hledat"</string> <string name="all_printers_label" msgid="3178848870161526399">"Všechny tiskárny"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Přidat službu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Zvolte službu tisku"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhledávání tiskáren"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Tisk úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Rušení úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml index 872158b899ab..c0dcee4d5c6c 100644 --- a/packages/PrintSpooler/res/values-da/strings.xml +++ b/packages/PrintSpooler/res/values-da/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Vis udskrift"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installer et PDF-visningsprog. for at se eksempel"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Udskrivningsapp gik ned"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"utilgængelig"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Udskriften generes"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Gem som PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Alle printere..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Søg"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alle printere"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Tilføj tjeneste"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Vælg udskriftstjeneste"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> udskrives"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annulleres"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Udskriften <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> mislykkedes"</string> diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml index 4e478bebf78c..97c8c0ed3574 100644 --- a/packages/PrintSpooler/res/values-de/strings.xml +++ b/packages/PrintSpooler/res/values-de/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Vorschau drucken"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-Viewer für Vorschau installieren"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Druck-App abgestürzt"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nicht verfügbar"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Seiten"</string> <string name="generating_print_job" msgid="3119608742651698916">"Druckauftrag wird generiert..."</string> <string name="save_as_pdf" msgid="5718454119847596853">"Als PDF speichern"</string> <string name="all_printers" msgid="5018829726861876202">"Alle Drucker…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Suchen"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alle Drucker"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Dienst hinzufügen"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Druckdienst auswählen"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Suche nach Druckern…"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird gedruckt..."</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird abgebrochen..."</string> diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml index 174ead31f9b4..6bdf19d44d42 100644 --- a/packages/PrintSpooler/res/values-el/strings.xml +++ b/packages/PrintSpooler/res/values-el/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Προεπισκόπηση εκτύπωσης"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Εγκαταστήστε το PDF viewer για προεπισκόπηση"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Διακοπή λειτουργίας εφαρμογής εκτύπωσης"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"μη διαθέσιμο"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Δημιουργία εργασίας εκτύπωσης"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Αποθήκευση ως PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Όλοι οι εκτυπωτές…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Αναζήτηση"</string> <string name="all_printers_label" msgid="3178848870161526399">"Όλοι οι εκτυπωτές"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Προσθήκη υπηρεσίας"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Επιλέξτε υπηρεσία εκτύπωσης"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Εκτύπωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ακύρωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Σφάλμα εκτυπωτή <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rCA/arrays.xml b/packages/PrintSpooler/res/values-en-rCA/arrays.xml new file mode 100644 index 000000000000..d40278c3973d --- /dev/null +++ b/packages/PrintSpooler/res/values-en-rCA/arrays.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <string-array name="pdf_printer_media_sizes" translatable="false"> + <item>NA_LETTER</item> + <item>NA_GOVT_LETTER</item> + <item>NA_LEGAL</item> + <item>NA_JUNIOR_LEGAL</item> + <item>NA_LEDGER</item> + <item>NA_TABLOID</item> + <item>NA_INDEX_3X5</item> + <item>NA_INDEX_4X6</item> + <item>NA_INDEX_5X8</item> + <item>NA_MONARCH</item> + <item>NA_QUARTO</item> + <item>NA_FOOLSCAP</item> + </string-array> + +</resources> diff --git a/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml b/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml new file mode 100644 index 000000000000..fb1f5d6b97b4 --- /dev/null +++ b/packages/PrintSpooler/res/values-en-rCA/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <string name="mediasize_default">NA_LETTER</string> + <string name="mediasize_standard">@string/mediasize_standard_north_america</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml index 43bba2488a98..77f275d4ade1 100644 --- a/packages/PrintSpooler/res/values-en-rGB/strings.xml +++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Print preview"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"unavailable"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string> <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string> <string name="all_printers" msgid="5018829726861876202">"All printers…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Search"</string> <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%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 43bba2488a98..77f275d4ade1 100644 --- a/packages/PrintSpooler/res/values-en-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Print preview"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"unavailable"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string> <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string> <string name="all_printers" msgid="5018829726861876202">"All printers…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Search"</string> <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rUS/arrays.xml b/packages/PrintSpooler/res/values-en-rUS/arrays.xml new file mode 100644 index 000000000000..d40278c3973d --- /dev/null +++ b/packages/PrintSpooler/res/values-en-rUS/arrays.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <string-array name="pdf_printer_media_sizes" translatable="false"> + <item>NA_LETTER</item> + <item>NA_GOVT_LETTER</item> + <item>NA_LEGAL</item> + <item>NA_JUNIOR_LEGAL</item> + <item>NA_LEDGER</item> + <item>NA_TABLOID</item> + <item>NA_INDEX_3X5</item> + <item>NA_INDEX_4X6</item> + <item>NA_INDEX_5X8</item> + <item>NA_MONARCH</item> + <item>NA_QUARTO</item> + <item>NA_FOOLSCAP</item> + </string-array> + +</resources> diff --git a/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml b/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml new file mode 100644 index 000000000000..fb1f5d6b97b4 --- /dev/null +++ b/packages/PrintSpooler/res/values-en-rUS/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <string name="mediasize_default">NA_LETTER</string> + <string name="mediasize_standard">@string/mediasize_standard_north_america</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml b/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml new file mode 100644 index 000000000000..fb1f5d6b97b4 --- /dev/null +++ b/packages/PrintSpooler/res/values-es-rUS/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <string name="mediasize_default">NA_LETTER</string> + <string name="mediasize_standard">@string/mediasize_standard_north_america</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index b2bb4025141c..c3cc9cbf2486 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visualizador de PDF para vista previa"</string> <string name="printing_app_crashed" msgid="854477616686566398">"La aplicación de impresión falló"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Buscar"</string> <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Agregar servicio"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Elegir servicio de impresión"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Error de impresora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index 40140610dafd..4cd820f35eab 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Vista previa de impresión"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar visor PDF para obtener vista previa"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Error de aplicación de impresión"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"no disponible"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string> <string name="generating_print_job" msgid="3119608742651698916">"Generando trabajo de impresión"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Todas las impresoras…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Buscar"</string> <string name="all_printers_label" msgid="3178848870161526399">"Todas las impresoras"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Añadir servicio"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Seleccionar servicio de impresión"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%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 f87c9fa39214..b2e579fbd731 100644 --- a/packages/PrintSpooler/res/values-et-rEE/strings.xml +++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Prindi eelvaade"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"PDF-vaaturi installimine eelvaate kuvamiseks"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Printimisrakendus jooksis kokku"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"pole teada"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Lehed"</string> <string name="generating_print_job" msgid="3119608742651698916">"Prinditöö loomine"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Salvesta PDF-ina"</string> <string name="all_printers" msgid="5018829726861876202">"Kõik printerid …"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Otsing"</string> <string name="all_printers_label" msgid="3178848870161526399">"Kõik printerid"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Lisa teenus"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Prinditeenuse valimine"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerite otsimine"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> printimine"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> tühistamine"</string> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 3bc377f22d31..1846398f7565 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"پیشنمایش چاپ"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"نصب نمایشگر PDF برای پیشنمایش"</string> <string name="printing_app_crashed" msgid="854477616686566398">"برنامه چاپ خراب شد"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"در دسترس نیست"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"در حال ایجاد کار چاپ"</string> <string name="save_as_pdf" msgid="5718454119847596853">"ذخیره بهعنوان PDF"</string> <string name="all_printers" msgid="5018829726861876202">"همه چاپگرها..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"جستجو"</string> <string name="all_printers_label" msgid="3178848870161526399">"همه چاپگرها"</string> <string name="add_print_service_label" msgid="5356702546188981940">"افزودن سرویس"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"انتخاب سرویس چاپ"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"در حال چاپ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"در حال لغو <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"خطای چاپگر <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml index ff79f5c43581..d6324a6345db 100644 --- a/packages/PrintSpooler/res/values-fi/strings.xml +++ b/packages/PrintSpooler/res/values-fi/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Tulostuksen esikatselu"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Asenna PDF-katseluohjelma esikatselua varten"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Tulostussovellus kaatui"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ei käytettävissä"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Sivut"</string> <string name="generating_print_job" msgid="3119608742651698916">"Luodaan tulostustyö"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Tallenna PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Kaikki tulostimet…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Haku"</string> <string name="all_printers_label" msgid="3178848870161526399">"Kaikki tulostimet"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Lisää palvelu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Valitse tulostuspalvelu"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Etsitään tulostimia"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Tulostetaan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Peruutetaan työ <xliff:g id="PRINT_JOB_NAME">%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 aa02b631a270..06b3096933e4 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour voir l\'aperçu"</string> <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"non offert"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer en format PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Rechercher"</string> <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter le service"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »…"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Erreur impression : « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index cc5aeef322c4..38d7cf6aa118 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Aperçu avant impression"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installer un lecteur PDF pour afficher l\'aperçu"</string> <string name="printing_app_crashed" msgid="854477616686566398">"L\'application à l\'origine de l\'impression a planté"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"non disponible"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Pages"</string> <string name="generating_print_job" msgid="3119608742651698916">"Génération tâche impression…"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Enregistrer au format .PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Toutes les imprimantes…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Rechercher"</string> <string name="all_printers_label" msgid="3178848870161526399">"Toutes les imprimantes"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Ajouter un service"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index a80177ff54e4..36c8039fb366 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"प्रिंट पूर्वावलोकन"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"पूर्वावलोकन के लिए PDF व्यूअर इंस्टॉल करें"</string> <string name="printing_app_crashed" msgid="854477616686566398">"प्रिंटिंग एप्लिकेशन क्रैश हो गया"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"अनुपलब्ध"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"पृष्ठ"</string> <string name="generating_print_job" msgid="3119608742651698916">"प्रिंट कार्य जनरेट हो रहा है"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में सहेजें"</string> <string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"खोजें"</string> <string name="all_printers_label" msgid="3178848870161526399">"सभी प्रिंटर"</string> <string name="add_print_service_label" msgid="5356702546188981940">"सेवा जोड़ें"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"प्रिंट सेवा चुनें"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर खोज रहा है"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> प्रिंट हो रहा है"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> रद्द हो रहा है"</string> diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml index 0aa184adb63d..ff22dfba3039 100644 --- a/packages/PrintSpooler/res/values-hr/strings.xml +++ b/packages/PrintSpooler/res/values-hr/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Pregled ispisa"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instaliraj PDF preglednik za pregled"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Srušila se aplikacija za ispis"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nedostupno"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generiranje zadatka ispisa"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Spremi kao PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Svi pisači…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Pretraživanje"</string> <string name="all_printers_label" msgid="3178848870161526399">"Svi pisači"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj uslugu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Odaberite uslugu ispisa"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Ispisivanje <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Otkazivanje zadatka <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Pogreška pisača <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml index d7c7d3345b2a..5dcedd871372 100644 --- a/packages/PrintSpooler/res/values-hu/strings.xml +++ b/packages/PrintSpooler/res/values-hu/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Előnézet nyomtatása"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Az előnézethez telepítse a PDF-megtekintőt."</string> <string name="printing_app_crashed" msgid="854477616686566398">"A nyomtatási alkalmazás összeomlott."</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nem érhető el"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Oldalak"</string> <string name="generating_print_job" msgid="3119608742651698916">"Nyomtatási feladat létrehozása"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Mentés PDF-ként"</string> <string name="all_printers" msgid="5018829726861876202">"Az összes nyomtató…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Keresés"</string> <string name="all_printers_label" msgid="3178848870161526399">"Az összes nyomtató"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Szolgáltatás hozzáadása"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Nyomtatási szolgáltatás kiválasztása"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Nyomtatók keresése"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> nyomtatása"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> törlése"</string> diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml index 3575f6faaa8e..8e547f88e284 100644 --- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml +++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Տպելու նախադիտում"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Նախադիտման համար տեղադրեք PDF դիտարկիչ"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Տպելու ծրագիրը վթարի է ենթարկվել"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"անհասանելի է"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Էջեր"</string> <string name="generating_print_job" msgid="3119608742651698916">"Ձևավորվում է տպելու աշխատանքը"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Պահել որպես PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Բոլոր տպիչները..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Որոնել"</string> <string name="all_printers_label" msgid="3178848870161526399">"Բոլոր տպիչները"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Ավելացնել ծառայություն"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Ընտրեք տպելու ծառայությունը"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Տպիչների որոնում"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Տպվում է՝ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ը չեղարկվում է"</string> diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml index 6bda2b790396..507f09efa233 100644 --- a/packages/PrintSpooler/res/values-in/strings.xml +++ b/packages/PrintSpooler/res/values-in/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Pratinjau cetak"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang penampil PDF untuk pratinjau"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplikasi pencetakan mogok"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"tidak tersedia"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Laman"</string> <string name="generating_print_job" msgid="3119608742651698916">"Membuat tugas pencetakan"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Semua printer…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Cari"</string> <string name="all_printers_label" msgid="3178848870161526399">"Semua printer"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan layanan"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Pilih layanan cetak"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari printer"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 71667dddd1a6..4bb7c5b144c6 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Anteprima di stampa"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installa visualizzatore PDF per anteprima"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Arresto anomalo dell\'app di stampa"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"non disponibile"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Pagine"</string> <string name="generating_print_job" msgid="3119608742651698916">"Generazione processo di stampa"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Salva in PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Tutte le stampanti…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Cerca"</string> <string name="all_printers_label" msgid="3178848870161526399">"Tutte le stampanti"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Aggiungi servizio"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Scegli servizio di stampa"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Ricerca di stampanti"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Stampa di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annullamento di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 337a4a340f15..75213396ef55 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"תצוגה מקדימה של הדפסה"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"התקן מציג PDF ליצירת תצוגה מקדימה"</string> <string name="printing_app_crashed" msgid="854477616686566398">"אפליקציית ההדפסה קרסה"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"לא זמין"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"עמודים"</string> <string name="generating_print_job" msgid="3119608742651698916">"יוצר עבודת הדפסה"</string> <string name="save_as_pdf" msgid="5718454119847596853">"שמור כ-PDF"</string> <string name="all_printers" msgid="5018829726861876202">"כל המדפסות…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"חפש"</string> <string name="all_printers_label" msgid="3178848870161526399">"כל המדפסות"</string> <string name="add_print_service_label" msgid="5356702546188981940">"הוסף שירות"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"בחר שירות הדפסה"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ja/donottranslate.xml b/packages/PrintSpooler/res/values-ja/donottranslate.xml new file mode 100644 index 000000000000..d334ddd312cf --- /dev/null +++ b/packages/PrintSpooler/res/values-ja/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + + <string name="mediasize_default">JIS_B5</string> + <string name="mediasize_standard">@string/mediasize_standard_japan</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index bf281342b446..755604973920 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"印刷プレビュー"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"プレビュー用PDFビューアをインストール"</string> <string name="printing_app_crashed" msgid="854477616686566398">"印刷アプリでの障害発生"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"不明"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"ページ数"</string> <string name="generating_print_job" msgid="3119608742651698916">"印刷ジョブを生成しています"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF形式で保存"</string> <string name="all_printers" msgid="5018829726861876202">"すべてのプリンタ…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"検索"</string> <string name="all_printers_label" msgid="3178848870161526399">"すべてのプリンタ"</string> <string name="add_print_service_label" msgid="5356702546188981940">"サービスを追加"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"印刷サービスの選択"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"プリンタの検索中"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>を印刷しています"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%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 93d36e00a8d7..25abd071019e 100644 --- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml +++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"ნახვა ამობეჭდვამდე"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"გადახედვისთვის დააყენეთ PDF მნახველი"</string> <string name="printing_app_crashed" msgid="854477616686566398">"ბეჭდვის აპი ავარიულად გაითიშა"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"მიუწვდომელი"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"მიმდინარეობის ბეჭდვის დავალების შექმნა"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF-ად შენახვა"</string> <string name="all_printers" msgid="5018829726861876202">"ყველა პრინტერი…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"ძიება"</string> <string name="all_printers_label" msgid="3178848870161526399">"ყველა პრინტერი"</string> <string name="add_print_service_label" msgid="5356702546188981940">"სერვისის დამატება"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"აირჩიეთ ბეჭდვის სერვისი"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"იბეჭდება <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"მიმდინარეობს <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ის გაუქმება"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"ბეჭდვის შეცდომა <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml index 805ddf928b5c..9125e282af07 100644 --- a/packages/PrintSpooler/res/values-km-rKH/strings.xml +++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"មើលមុនបោះពុម្ព"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"ដំឡើងកម្មវិធីមើល PDF សម្រាប់ការមើលជាមុន"</string> <string name="printing_app_crashed" msgid="854477616686566398">"កម្មវិធីបោះពុម្ពគាំង"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"មិនមាន"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"ទំព័រ"</string> <string name="generating_print_job" msgid="3119608742651698916">"បង្កើតការងារបោះពុម្ព"</string> <string name="save_as_pdf" msgid="5718454119847596853">"រក្សាទុកជា PDF"</string> <string name="all_printers" msgid="5018829726861876202">"ម៉ាស៊ីនបោះពុម្ពទាំងអស់ ..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"ស្វែងរក"</string> <string name="all_printers_label" msgid="3178848870161526399">"ម៉ាស៊ីនបោះពុម្ពទាំងអស់"</string> <string name="add_print_service_label" msgid="5356702546188981940">"បន្ថែមសេវាកម្ម"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"ជ្រើសសេវាបោះពុម្ព"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"ស្វែងរកម៉ាស៊ីនបោះពុម្ព"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"កំពុងបោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ការបោះបង់ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml index 16bfbbbd6890..0aef672efe0d 100644 --- a/packages/PrintSpooler/res/values-ko/strings.xml +++ b/packages/PrintSpooler/res/values-ko/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"인쇄 미리보기"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"미리보기용 PDF 뷰어 설치"</string> <string name="printing_app_crashed" msgid="854477616686566398">"인쇄 앱에 오류 발생"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"사용할 수 없음"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"페이지"</string> <string name="generating_print_job" msgid="3119608742651698916">"인쇄 작업 생성 중"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF로 저장"</string> <string name="all_printers" msgid="5018829726861876202">"모든 프린터…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"검색"</string> <string name="all_printers_label" msgid="3178848870161526399">"모든 프린터"</string> <string name="add_print_service_label" msgid="5356702546188981940">"서비스 추가"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"인쇄 서비스 선택"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"프린터 검색 중"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 인쇄 중"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 취소 중"</string> diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml index be81102e479c..cbbe9b6e8a2e 100644 --- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml +++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"ເບິ່ງກ່ອນພິມ"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"ຕິດຕັ້ງໂປຼແກຼມເບິ່ງ PDF ເພື່ອເບິ່ງຕົວຢ່າງ"</string> <string name="printing_app_crashed" msgid="854477616686566398">"ແອັບຯພິມລົ້ມເຫລວ"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ບໍ່ມີຂໍ້ມູນ"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"ໜ້າ"</string> <string name="generating_print_job" msgid="3119608742651698916">"ກຳລັງສ້າງວຽກພິມ"</string> <string name="save_as_pdf" msgid="5718454119847596853">"ບັນທຶກເປັນ PDF"</string> <string name="all_printers" msgid="5018829726861876202">"ທຸກເຄື່ອງພິມ..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"ຊອກຫາ"</string> <string name="all_printers_label" msgid="3178848870161526399">"ທຸກເຄື່ອງພິມ"</string> <string name="add_print_service_label" msgid="5356702546188981940">"ເພີ່ມບໍລິການ"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"ເລືອກບໍລິການການພິມ"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"ກຳລັງຊອກຫາເຄື່ອງພິມ"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"ກຳລັງພິມ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ກຳລັງຍົກເລີກ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml index 06d79ee6c0bc..624854fde6b7 100644 --- a/packages/PrintSpooler/res/values-lt/strings.xml +++ b/packages/PrintSpooler/res/values-lt/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Spaudinio peržiūra"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Įdiegti PDF peržiūros priemonę"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Spausdinimo programa užstrigo"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nežinoma"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generuojama spausd. užduotis"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Išsaugoti kaip PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Visi spausdintuvai…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Ieškoti"</string> <string name="all_printers_label" msgid="3178848870161526399">"Visi spausdintuvai"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Pridėti paslaugą"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Pasirinkite spausdinimo paslaugą"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Spausdinama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Atšaukiama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Spausdintuvo klaida: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml index b5ef76ef8127..a7066fc550d9 100644 --- a/packages/PrintSpooler/res/values-lv/strings.xml +++ b/packages/PrintSpooler/res/values-lv/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Drukas priekšskatījums"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalēt PDF skatītāju priekšskatīšanai"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Drukas lietotne avarēja"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"Nav zināms"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Ģenerē drukas darbu…"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Saglabāt kā PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Visi printeri…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Meklēt"</string> <string name="all_printers_label" msgid="3178848870161526399">"Visi printeri"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Pievienot pakalpojumu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Izvēlieties drukāšanas pakalpojumu"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Notiek darba <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> drukāšana…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Pārtrauc drukas darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Printera kļūda ar darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml index 5f16746cd58e..58dea51436fd 100644 --- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml +++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Хэвлэхээр урьдчилан харах"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг суулгах"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Хэвлэгч апп гацсан"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"Байхгүй"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Хуудас"</string> <string name="generating_print_job" msgid="3119608742651698916">"Хэвлэх ажил үүсгэж байна"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF болгож хадгалах"</string> <string name="all_printers" msgid="5018829726861876202">"Бүх принтерүүд…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Хайх"</string> <string name="all_printers_label" msgid="3178848870161526399">"Бүх принтерүүд"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Үйлчилгээ нэмэх"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Хэвлэх үйлчилгээг сонгох"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтер хайж байна"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Хэвлэж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Цуцлаж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml index 8893e0912da5..90fa63a0e71f 100644 --- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml +++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Pratonton cetak"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Pasang pemapar PDF untuk pratonton"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Apl percetakan ranap"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"tidak tersedia"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Halaman"</string> <string name="generating_print_job" msgid="3119608742651698916">"Menjana kerja cetak"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Simpan sebagai PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Semua pencetak..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Cari"</string> <string name="all_printers_label" msgid="3178848870161526399">"Semua pencetak"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Tambahkan perkhidmatan"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Pilih perkhidmatan cetak"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari pencetak"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml index 002068c289ac..44e17acb36a9 100644 --- a/packages/PrintSpooler/res/values-nb/strings.xml +++ b/packages/PrintSpooler/res/values-nb/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Utskriftsforhåndsvisning"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installer PDF-leser for forhåndsvisning"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen krasjet"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ikke tilgjengelig"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Genererer utskriftsjobb"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Lagre som PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Alle skrivere"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Søk"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alle skrivere"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Legg til tjeneste"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Velg utskriftstjeneste"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Skriverfeil <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index f16922e661a6..9c074df6a6db 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Afdrukvoorbeeld"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Pdf-viewer installeren voor voorbeeld"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Afdruk-app gecrasht"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"niet beschikbaar"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Afdruktaak genereren"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Opslaan als pdf"</string> <string name="all_printers" msgid="5018829726861876202">"Alle printers…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Zoeken"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alle printers"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Service toevoegen"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Afdrukservice kiezen"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> afdrukken"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annuleren"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Printerfout <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml index d5db22e58127..bcd57b2794a8 100644 --- a/packages/PrintSpooler/res/values-pl/strings.xml +++ b/packages/PrintSpooler/res/values-pl/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Podgląd wydruku"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Zainstaluj przeglądarkę PDF, by zobaczyć podgląd"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacja drukująca uległa awarii"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"brak informacji"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generowanie zadania wydruku"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Zapisz jako PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Wszystkie drukarki…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Szukaj"</string> <string name="all_printers_label" msgid="3178848870161526399">"Wszystkie drukarki"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj usługę"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Wybierz usługę drukowania"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Drukowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Anulowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Błąd drukarki: <xliff:g id="PRINT_JOB_NAME">%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 a4cb98dc4f38..bc7a67721430 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Pré-visualização de impressão"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o leitor de PDF para pré-visualização"</string> <string name="printing_app_crashed" msgid="854477616686566398">"A aplicação de impressão bloqueou"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"indisponível"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"A gerar tarefa de impressão"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Pesquisar"</string> <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Escolher o serviço de impressão"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A cancelar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Erro da impressora <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index 230e827251bb..6c63502256e5 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Visualização de impressão"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o visualizador de PDF"</string> <string name="printing_app_crashed" msgid="854477616686566398">"O aplicativo de impressão falhou"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"indisponível"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Páginas"</string> <string name="generating_print_job" msgid="3119608742651698916">"Gerando trabalho de impressão"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Salvar como PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Pesquisar"</string> <string name="all_printers_label" msgid="3178848870161526399">"Todas as impressoras"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Adicionar serviço"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index 37fd6b3ce0eb..d194d65c2456 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Previzualizați printarea"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalați PDF viewer pentru previzualizare"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplicația de printare s-a blocat"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"indisponibil"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Se generează sarcină printare"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Salvați ca PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Toate imprimantele..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Căutați"</string> <string name="all_printers_label" msgid="3178848870161526399">"Toate imprimantele"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Adăugați un serviciu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Alegeți serviciul de printare"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Se printează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Se anulează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Eroare de printare: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index 0271587da8ba..bbf66fb2edf2 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Предварительный просмотр"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Установить средство просмотра PDF"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Сбой приложения печати"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"неизвестно"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Создание задания печати…"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Сохранить как PDF-файл"</string> <string name="all_printers" msgid="5018829726861876202">"Все принтеры"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Поиск"</string> <string name="all_printers_label" msgid="3178848870161526399">"Все принтеры"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Добавить службу печати"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Выберите службу печати"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Печать задания \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\"…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отмена задания <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Ошибка задания \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\""</string> diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml index 01e6d03039e9..81361ad881c1 100644 --- a/packages/PrintSpooler/res/values-sk/strings.xml +++ b/packages/PrintSpooler/res/values-sk/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Ukážka pred tlačou"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Inštalovať zobrazovač PDF na zobrazenie ukážky"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplikácia pre tlač zlyhala"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"nie je k dispozícii"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Generuje sa tlačová úloha"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Uložiť ako PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Všetky tlačiarne..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"VYHĽADÁVANIE"</string> <string name="all_printers_label" msgid="3178848870161526399">"Všetky tlačiarne"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Pridať službu"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Výber tlačovej služby"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Prebieha tlač úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prebieha zrušenie úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Chyba tlačiarne – úloha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml index 61f3dc0b930b..08868319f861 100644 --- a/packages/PrintSpooler/res/values-sl/strings.xml +++ b/packages/PrintSpooler/res/values-sl/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Predogled tiskanja"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Za predogled namestite pregledovalnik za PDF-je"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Aplikacija za tiskanje se je zrušila"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ni na voljo"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Št. strani:"</string> <string name="generating_print_job" msgid="3119608742651698916">"Ustvarjanje zahteve za tisk"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Shrani kot PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Vsi tiskalniki …"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Iskanje"</string> <string name="all_printers_label" msgid="3178848870161526399">"Vsi tiskalniki"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Dodaj storitev"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Izberite tiskalno storitev"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Iskanje tiskalnikov"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Tiskanje: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Preklic: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index 757871f8dbb6..93ca41fe027b 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Преглед пре штампања"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Инсталирај PDF приказивач за преглед"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Апликација за штампање је отказала"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"недоступно"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Генерисање задатка за штампање"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Сачувај као PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Сви штампачи…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Претражи"</string> <string name="all_printers_label" msgid="3178848870161526399">"Сви штампачи"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Додај услугу"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Изаберите услугу штампања"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Штампа се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отказује се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Грешка штампача <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml index 7c2898477fe5..000f88ea4bd4 100644 --- a/packages/PrintSpooler/res/values-sv/strings.xml +++ b/packages/PrintSpooler/res/values-sv/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Förhandsgranskning"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Installera PDF-läsare för förhandsgranskning"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Utskriftsappen kraschade"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"otillgängligt"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Genererar utskriftsjobb"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Spara som PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Alla skrivare ..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Sök"</string> <string name="all_printers_label" msgid="3178848870161526399">"Alla skrivare"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Lägg till tjänst"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Välj utskriftstjänst"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Skrivarfel för <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index 13ccf462d5d9..7e655eed525b 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Chungulia kwanza kabla ya kuchapisha"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Sakinisha kitazamaji cha PDF kwa onyesho la kuchungulia"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Programu ya kuchapisha imeacha kufanya kazi"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"haipatikani"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Inazanzisha kazi ya kuchapisha"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Hifadhi kama PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Printa zote..."</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Tafuta"</string> <string name="all_printers_label" msgid="3178848870161526399">"Printa zote"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Ongeza huduma"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Chagua huduma ya printa"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Inachapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Inaghairi <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Hitilafu ya kuchapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml index fee7c11e9b84..9f6e2262f2a5 100644 --- a/packages/PrintSpooler/res/values-th/strings.xml +++ b/packages/PrintSpooler/res/values-th/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"ตัวอย่างก่อนพิมพ์"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"ติดตั้งโปรแกรมดู PDF เพื่อดูหน้าตัวอย่าง"</string> <string name="printing_app_crashed" msgid="854477616686566398">"แอปการพิมพ์ขัดข้อง"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ไม่มีข้อมูล"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"หน้า"</string> <string name="generating_print_job" msgid="3119608742651698916">"กำลังสร้างงานพิมพ์"</string> <string name="save_as_pdf" msgid="5718454119847596853">"บันทึกเป็น PDF"</string> <string name="all_printers" msgid="5018829726861876202">"เครื่องพิมพ์ทั้งหมด…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"ค้นหา"</string> <string name="all_printers_label" msgid="3178848870161526399">"เครื่องพิมพ์ทั้งหมด"</string> <string name="add_print_service_label" msgid="5356702546188981940">"เพิ่มบริการ"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"เลือกบริการพิมพ์"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"กำลังค้นหาเครื่องพิมพ์"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"กำลังพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"กำลังยกเลิก <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml index 68f74cd52bd0..2dc3c39d0549 100644 --- a/packages/PrintSpooler/res/values-tl/strings.xml +++ b/packages/PrintSpooler/res/values-tl/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Preview sa pag-print"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Mag-install ng PDF viewer para sa pag-preview"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Nag-crash ang app sa pag-print"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"hindi available"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Mga Pahina"</string> <string name="generating_print_job" msgid="3119608742651698916">"Gumagawa ng pag-print"</string> <string name="save_as_pdf" msgid="5718454119847596853">"I-save bilang PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Lahat ng printer…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Hanapin"</string> <string name="all_printers_label" msgid="3178848870161526399">"Lahat ng printer"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Magdagdag ng serbisyo"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Pumili ng serbisyo ng pag-print"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Naghahanap ng mga printer"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Pini-print ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kinakansela ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml index 5cd5f892750d..bfc80af68fc6 100644 --- a/packages/PrintSpooler/res/values-tr/strings.xml +++ b/packages/PrintSpooler/res/values-tr/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Yazdırmayı önizle"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Önizlemek için PDF görüntüleyici yükleyin"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Yazdırma uygulaması kilitlendi"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"bilinmiyor"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Yazdırma işi oluşturuluyor"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF olarak kaydet"</string> <string name="all_printers" msgid="5018829726861876202">"Tüm yazıcılar…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Ara"</string> <string name="all_printers_label" msgid="3178848870161526399">"Tüm yazıcılar"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Hizmet ekle"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Yazdırma hizmetini seçin"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> yazdırılıyor"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> iptal ediliyor"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Yazıcı hatası: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index d3bed82c717c..bd8c375d7f5d 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Версія для друку"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Установити засіб перегляду PDF"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Програма друку аварійно завершила роботу"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"недоступно"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Сторінки"</string> <string name="generating_print_job" msgid="3119608742651698916">"Створюється завдання друку"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Зберегти як PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Усі принтери…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Пошук"</string> <string name="all_printers_label" msgid="3178848870161526399">"Усі принтери"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Додати службу"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Вибрати службу друку"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук принтерів"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" друкується"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" скасовується"</string> diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml index 3fd60136afcd..6546f0eebf4f 100644 --- a/packages/PrintSpooler/res/values-vi/strings.xml +++ b/packages/PrintSpooler/res/values-vi/strings.xml @@ -29,15 +29,26 @@ <string name="print_preview" msgid="8010217796057763343">"Xem trước bản in"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Cài đặt trình xem PDF để xem trước"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Ứng dụng in gặp lỗi"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"không có sẵn"</string> + <string name="page_count_unknown" msgid="6058852665954511124">"Trang"</string> <string name="generating_print_job" msgid="3119608742651698916">"Đang tạo lệnh in"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Lưu dưới dạng PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Tất cả máy in…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Tìm kiếm"</string> <string name="all_printers_label" msgid="3178848870161526399">"Tất cả máy in"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Thêm dịch vụ"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Chọn dịch vụ in"</string> - <!-- no translation found for print_searching_for_printers (6550424555079932867) --> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Đang tìm kiếm máy in"</string> + <!-- no translation found for print_no_printers (4869403323900054866) --> <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"In <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Hủy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml b/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml new file mode 100644 index 000000000000..f069da3a09e5 --- /dev/null +++ b/packages/PrintSpooler/res/values-zh-rCN/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <string name="mediasize_default">PRC_9</string> + <string name="mediasize_standard">@string/mediasize_standard_china</string> + +</resources> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 2dfaa1e82943..0e9b45709f49 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"打印预览"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"安装 PDF 查看器以便预览"</string> <string name="printing_app_crashed" msgid="854477616686566398">"打印应用崩溃了"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"未知"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"正在生成打印作业"</string> <string name="save_as_pdf" msgid="5718454119847596853">"保存为 PDF"</string> <string name="all_printers" msgid="5018829726861876202">"所有打印机…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"搜索"</string> <string name="all_printers_label" msgid="3178848870161526399">"所有打印机"</string> <string name="add_print_service_label" msgid="5356702546188981940">"添加服务"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"选择打印服务"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"正在打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"打印机在打印“<xliff:g id="PRINT_JOB_NAME">%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 99f17e487052..71215c8ffdae 100644 --- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"預覽列印"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"安裝預覽所需的 PDF 檢視器"</string> <string name="printing_app_crashed" msgid="854477616686566398">"列印應用程式當機了"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"頁數不明"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"正在產生列印工作"</string> <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string> <string name="all_printers" msgid="5018829726861876202">"所有打印機…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"搜尋"</string> <string name="all_printers_label" msgid="3178848870161526399">"所有打印機"</string> <string name="add_print_service_label" msgid="5356702546188981940">"新增服務"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"打印機錯誤:<xliff:g id="PRINT_JOB_NAME">%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 4e7110b7d665..66ceb417654c 100644 --- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"列印預覽"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"安裝預覽所需的 PDF 檢視器"</string> <string name="printing_app_crashed" msgid="854477616686566398">"列印應用程式當機了"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"不明"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"正在產生列印工作"</string> <string name="save_as_pdf" msgid="5718454119847596853">"儲存為 PDF"</string> <string name="all_printers" msgid="5018829726861876202">"所有印表機…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"搜尋"</string> <string name="all_printers_label" msgid="3178848870161526399">"所有印表機"</string> <string name="add_print_service_label" msgid="5356702546188981940">"新增服務"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"印表機發生錯誤:<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml index b5278fbf9d7c..e1cb758fda7b 100644 --- a/packages/PrintSpooler/res/values-zu/strings.xml +++ b/packages/PrintSpooler/res/values-zu/strings.xml @@ -29,16 +29,29 @@ <string name="print_preview" msgid="8010217796057763343">"Ukubuka kuqala kokuphrinta"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Faka isibukeli se-PDF ukuze uhlole kuqala"</string> <string name="printing_app_crashed" msgid="854477616686566398">"Ukuphrinta uhlelo lokusebenza kukhubazekile"</string> - <string name="page_count_unknown" msgid="7412881437770983864">"ayitholakali"</string> + <!-- no translation found for page_count_unknown (6058852665954511124) --> + <skip /> <string name="generating_print_job" msgid="3119608742651698916">"Ikhiqiza umsebenzi wokuphrinta"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Londoloza njenge-PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Wonke amaphrinta…"</string> + <!-- no translation found for print_dialog (32628687461331979) --> + <skip /> <string name="search" msgid="5421724265322228497">"Sesha"</string> <string name="all_printers_label" msgid="3178848870161526399">"Wonke amaphrinta"</string> <string name="add_print_service_label" msgid="5356702546188981940">"Engeza isevisi"</string> + <!-- no translation found for print_search_box_shown_utterance (7967404953901376090) --> + <skip /> + <!-- no translation found for print_search_box_hidden_utterance (5727755169343113351) --> + <skip /> + <!-- no translation found for print_add_printer (1088656468360653455) --> + <skip /> + <!-- no translation found for print_search_result_count_utterance:one (4484953260685964252) --> + <!-- no translation found for print_search_result_count_utterance:other (6533817036607128241) --> <string name="choose_print_service" msgid="3740309762324459694">"Khetha isevisi yephrinta"</string> <!-- no translation found for print_searching_for_printers (6550424555079932867) --> <skip /> + <!-- no translation found for print_no_printers (4869403323900054866) --> + <skip /> <string name="printing_notification_title_template" msgid="295903957762447362">"Iphrinta i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ikhansela i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"Iphutha lephrinta ye-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values/arrays.xml b/packages/PrintSpooler/res/values/arrays.xml new file mode 100644 index 000000000000..afe3c7122dd7 --- /dev/null +++ b/packages/PrintSpooler/res/values/arrays.xml @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <string-array name="mediasize_to_standard_map" translatable="false"> + <!-- North America --> + <item>NA_LETTER</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_GOVT_LETTER</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_LEGAL</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_JUNIOR_LEGAL</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_LEDGER</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_TABLOID</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_INDEX_3X5</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_INDEX_4X6</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_INDEX_5X8</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_MONARCH</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_QUARTO</item> + <item>@string/mediasize_standard_north_america</item> + <item>NA_FOOLSCAP</item> + <item>@string/mediasize_standard_north_america</item> + + <!-- China --> + <item>ROC_8K</item> + <item>@string/mediasize_standard_china</item> + <item>ROC_16K</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_1</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_2</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_3</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_4</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_5</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_6</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_7</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_8</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_9</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_10</item> + <item>@string/mediasize_standard_china</item> + <item>PRC_16K</item> + <item>@string/mediasize_standard_china</item> + <item>OM_PA_KAI</item> + <item>@string/mediasize_standard_china</item> + <item>OM_DAI_PA_KAI</item> + <item>@string/mediasize_standard_china</item> + <item>OM_JUURO_KU_KAI</item> + <item>@string/mediasize_standard_china</item> + + <!-- Japan --> + <item>JIS_B10</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B9</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B8</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B7</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B6</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B5</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B4</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B3</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B2</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B1</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_B0</item> + <item>@string/mediasize_standard_japan</item> + <item>JIS_EXEC</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_CHOU4</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_CHOU3</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_CHOU2</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_HAGAKI</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_OUFUKU</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_KAHU</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_KAKU2</item> + <item>@string/mediasize_standard_japan</item> + <item>JPN_YOU4</item> + <item>@string/mediasize_standard_japan</item> + + <!-- Everything else is ISO --> + </string-array> + + <string-array name="pdf_printer_media_sizes" translatable="false"> + <item>ISO_A0</item> + <item>ISO_A1</item> + <item>ISO_A2</item> + <item>ISO_A3</item> + <item>ISO_A4</item> + <item>ISO_A5</item> + <item>ISO_A6</item> + <item>ISO_A7</item> + <item>ISO_A8</item> + <item>ISO_A9</item> + <item>ISO_A10</item> + <item>ISO_B1</item> + <item>ISO_B2</item> + <item>ISO_B3</item> + <item>ISO_B4</item> + <item>ISO_B5</item> + <item>ISO_B6</item> + <item>ISO_B7</item> + <item>ISO_B8</item> + <item>ISO_B9</item> + <item>ISO_B10</item> + <item>ISO_C1</item> + <item>ISO_C2</item> + <item>ISO_C3</item> + <item>ISO_C4</item> + <item>ISO_C5</item> + <item>ISO_C6</item> + <item>ISO_C7</item> + <item>ISO_C8</item> + <item>ISO_C9</item> + <item>ISO_C10</item> + </string-array> + +</resources> diff --git a/packages/PrintSpooler/res/values/donottranslate.xml b/packages/PrintSpooler/res/values/donottranslate.xml new file mode 100644 index 000000000000..8069a1da89b3 --- /dev/null +++ b/packages/PrintSpooler/res/values/donottranslate.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <!-- Media size standards --> + <string name="mediasize_standard_iso">0</string> + <string name="mediasize_standard_north_america">1</string> + <string name="mediasize_standard_japan">2</string> + <string name="mediasize_standard_china">3</string> + + <!-- Locale specific values --> + <string name="mediasize_default">ISO_A4</string> + <string name="mediasize_standard">@string/mediasize_standard_iso</string> + +</resources> diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml index 5b947baca31c..c82a20ee3497 100644 --- a/packages/PrintSpooler/res/values/strings.xml +++ b/packages/PrintSpooler/res/values/strings.xml @@ -56,7 +56,7 @@ <string name="printing_app_crashed">Printing app crashed</string> <!-- Title if the number of pages in a printed document is unknown. [CHAR LIMIT=20] --> - <string name="page_count_unknown">unavailable</string> + <string name="page_count_unknown">Pages</string> <!-- Title for the temporary dialog show while an app is generating a print job. [CHAR LIMIT=30] --> <string name="generating_print_job">Generating print job</string> @@ -67,6 +67,9 @@ <!-- Title for the open all printers UI option in the printer list. [CHAR LIMIT=30] --> <string name="all_printers">All printers…</string> + <!-- Title for the print dialog announced to the user for accessibility. Not shown in the UI. [CHAR LIMIT=none] --> + <string name="print_dialog">Print dialog</string> + <!-- Select printer activity --> <!-- Title for the share action bar menu item. [CHAR LIMIT=20] --> @@ -78,14 +81,32 @@ <!-- Title of the button to install a print service. [CHAR LIMIT=25] --> <string name="add_print_service_label">Add service</string> + <!-- Utterance to announce that the search box is shown. This is spoken to a blind user. [CHAR LIMIT=none] --> + <string name="print_search_box_shown_utterance">Search box shown</string> + + <!-- Utterance to announce that the search box is hidden. This is spoken to a blind user. [CHAR LIMIT=none] --> + <string name="print_search_box_hidden_utterance">Search box hidden</string> + + <!-- Title of the action bar button to got to add a printer. [CHAR LIMIT=25] --> + <string name="print_add_printer">Add printer</string> + + <!-- Utterance to announce a change in the number of matches during a search. This is spoken to a blind user. [CHAR LIMIT=none] --> + <plurals name="print_search_result_count_utterance"> + <item quantity="one"><xliff:g id="count" example="1">%1$s</xliff:g> printer found</item> + <item quantity="other"><xliff:g id="count" example="2">%1$s</xliff:g> printers found</item> + </plurals> + <!-- Add printer dialog --> <!-- Title for the alert dialog for selecting a print service. [CHAR LIMIT=50] --> <string name="choose_print_service">Choose print service</string> - <!-- Title for the prompt shown as a placeholder if no printers are found while searching. [CHAR LIMIT=50] --> + <!-- Title for the prompt shown as a placeholder if no printers are found while not searching. [CHAR LIMIT=50] --> <string name="print_searching_for_printers">Searching for printers</string> + <!-- Title for the prompt shown as a placeholder if there are no printers while searching. [CHAR LIMIT=50] --> + <string name="print_no_printers">No printers found</string> + <!-- Notifications --> <!-- Template for the notificaiton label for a printing print job. [CHAR LIMIT=25] --> diff --git a/packages/PrintSpooler/res/values/styles.xml b/packages/PrintSpooler/res/values/styles.xml index f6db6befd928..d64380aca4ff 100644 --- a/packages/PrintSpooler/res/values/styles.xml +++ b/packages/PrintSpooler/res/values/styles.xml @@ -30,7 +30,6 @@ </style> <style name="PrintOptionEditTextStyle"> - <item name="android:selectAllOnFocus">true</item> <item name="android:minHeight">?android:attr/listPreferredItemHeightSmall</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">end</item> diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java index 65af8304d249..8aa290cea4b6 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java +++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java @@ -63,7 +63,6 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { private static final boolean DEBUG = false; private static final double WEIGHT_DECAY_COEFFICIENT = 0.95f; - private static final int MAX_HISTORY_LENGTH = 50; private static final int MAX_FAVORITE_PRINTER_COUNT = 4; @@ -388,25 +387,25 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { + FusedPrintersProvider.this.hashCode()); } - // Ignore printer records whose target services are not installed. + // Ignore printer records whose target services are not enabled. PrintManager printManager = (PrintManager) getContext() .getSystemService(Context.PRINT_SERVICE); List<PrintServiceInfo> services = printManager - .getInstalledPrintServices(); + .getEnabledPrintServices(); - Set<ComponentName> installedComponents = new ArraySet<ComponentName>(); + Set<ComponentName> enabledComponents = new ArraySet<ComponentName>(); final int installedServiceCount = services.size(); for (int i = 0; i < installedServiceCount; i++) { ServiceInfo serviceInfo = services.get(i).getResolveInfo().serviceInfo; ComponentName componentName = new ComponentName( serviceInfo.packageName, serviceInfo.name); - installedComponents.add(componentName); + enabledComponents.add(componentName); } final int printerCount = printers.size(); for (int i = printerCount - 1; i >= 0; i--) { ComponentName printerServiceName = printers.get(i).getId().getServiceName(); - if (!installedComponents.contains(printerServiceName.getPackageName())) { + if (!enabledComponents.contains(printerServiceName)) { printers.remove(i); } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java b/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java new file mode 100644 index 000000000000..ac2756293e8c --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/MediaSizeUtils.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2013 The Android Open Source 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.printspooler; + +import android.content.Context; +import android.print.PrintAttributes.MediaSize; +import android.util.ArrayMap; + +import java.util.Comparator; +import java.util.Map; + +/** + * Utility functions and classes for dealing with media sizes. + */ +public class MediaSizeUtils { + + private static Map<MediaSize, String> sMediaSizeToStandardMap; + + /** + * Gets the default media size for the current locale. + * + * @param context Context for accessing resources. + * @return The default media size. + */ + public static MediaSize getDefault(Context context) { + String mediaSizeId = context.getString(R.string.mediasize_default); + return MediaSize.getStandardMediaSizeById(mediaSizeId); + } + + private static String getStandardForMediaSize(Context context, MediaSize mediaSize) { + if (sMediaSizeToStandardMap == null) { + sMediaSizeToStandardMap = new ArrayMap<MediaSize, String>(); + String[] mediaSizeToStandardMapValues = context.getResources() + .getStringArray(R.array.mediasize_to_standard_map); + final int mediaSizeToStandardCount = mediaSizeToStandardMapValues.length; + for (int i = 0; i < mediaSizeToStandardCount; i += 2) { + String mediaSizeId = mediaSizeToStandardMapValues[i]; + MediaSize key = MediaSize.getStandardMediaSizeById(mediaSizeId); + String value = mediaSizeToStandardMapValues[i + 1]; + sMediaSizeToStandardMap.put(key, value); + } + } + String standard = sMediaSizeToStandardMap.get(mediaSize); + return (standard != null) ? standard : context.getString( + R.string.mediasize_standard_iso); + } + + /** + * Comparator for ordering standard media sizes. The ones for the current + * standard go to the top and the ones for the other standards follow grouped + * by standard. Media sizes of the same standard are ordered alphabetically. + */ + public static final class MediaSizeComparator implements Comparator<MediaSize> { + private final Context mContext; + + public MediaSizeComparator(Context context) { + mContext = context; + } + + @Override + public int compare(MediaSize lhs, MediaSize rhs) { + String currentStandard = mContext.getString(R.string.mediasize_standard); + String lhsStandard = getStandardForMediaSize(mContext, lhs); + String rhsStandard = getStandardForMediaSize(mContext, rhs); + + // The current standard always wins. + if (lhsStandard.equals(currentStandard)) { + if (!rhsStandard.equals(currentStandard)) { + return -1; + } + } else if (rhsStandard.equals(currentStandard)) { + return 1; + } + + if (!lhsStandard.equals(rhsStandard)) { + // Different standards - use the standard ordering. + return lhsStandard.compareTo(rhsStandard); + } else { + // Same standard - sort alphabetically by label. + return lhs.getLabel(mContext.getPackageManager()). + compareTo(rhs.getLabel(mContext.getPackageManager())); + } + } + } +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java index dae7770eec69..2bd0443dd9e8 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java +++ b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java @@ -110,7 +110,7 @@ public class NotificationController { printJob.getLabel())) .addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel), createCancelIntent(printJob)) - .addAction(android.R.drawable.ic_secure, mContext.getString(R.string.restart), + .addAction(R.drawable.ic_restart, mContext.getString(R.string.restart), createRestartIntent(printJob.getId())) .setContentText(printJob.getPrinterName()) .setWhen(System.currentTimeMillis()) diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 0c593ef196c0..7f9be6ce702a 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -57,7 +57,6 @@ import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.text.TextWatcher; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; @@ -80,6 +79,8 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; +import com.android.printspooler.MediaSizeUtils.MediaSizeComparator; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -89,9 +90,9 @@ import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -151,26 +152,6 @@ public class PrintJobConfigActivity extends Activity { "[\\s]*[0-9]*[\\s]*[\\-]?[\\s]*[0-9]*[\\s]*?(([,])" + "[\\s]*[0-9]*[\\s]*[\\-]?[\\s]*[0-9]*[\\s]*|[\\s]*)+"); - // The list of countries where Letter is the default paper size. Culled from - // the OpenOffice wiki at http://wiki.openoffice.org/wiki/DefaultPaperSize. - private static final Set<String> sLetterDefaultCountries = new ArraySet<String>(); - static { - sLetterDefaultCountries.add("US"); - sLetterDefaultCountries.add("CA"); - sLetterDefaultCountries.add("BZ"); - sLetterDefaultCountries.add("CL"); - sLetterDefaultCountries.add("CR"); - sLetterDefaultCountries.add("GT"); - sLetterDefaultCountries.add("NI"); - sLetterDefaultCountries.add("PA"); - sLetterDefaultCountries.add("PR"); - sLetterDefaultCountries.add("SV"); - sLetterDefaultCountries.add("VE"); - sLetterDefaultCountries.add("MX"); - sLetterDefaultCountries.add("CO"); - sLetterDefaultCountries.add("PH"); - } - public static final PageRange[] ALL_PAGES_ARRAY = new PageRange[] {PageRange.ALL_PAGES}; private final PrintAttributes mOldPrintAttributes = new PrintAttributes.Builder().build(); @@ -197,6 +178,8 @@ public class PrintJobConfigActivity extends Activity { protected void onCreate(Bundle bundle) { super.onCreate(bundle); + setTitle(R.string.print_dialog); + Bundle extras = getIntent().getExtras(); PrintJobInfo printJob = extras.getParcelable(EXTRA_PRINT_JOB); @@ -826,6 +809,8 @@ public class PrintJobConfigActivity extends Activity { private PrinterInfo mCurrentPrinter; + private final MediaSizeComparator mMediaSizeComparator; + private final OnItemSelectedListener mOnItemSelectedListener = new AdapterView.OnItemSelectedListener() { @Override @@ -872,7 +857,11 @@ public class PrintJobConfigActivity extends Activity { return; } SpinnerItem<MediaSize> mediaItem = mMediaSizeSpinnerAdapter.getItem(position); - mCurrPrintAttributes.setMediaSize(mediaItem.value); + if (mOrientationSpinner.getSelectedItemPosition() == 0) { + mCurrPrintAttributes.setMediaSize(mediaItem.value.asPortrait()); + } else { + mCurrPrintAttributes.setMediaSize(mediaItem.value.asLandscape()); + } if (!hasErrors()) { mController.update(); } @@ -971,18 +960,22 @@ public class PrintJobConfigActivity extends Activity { private void updatePrintAttributes(PrinterCapabilitiesInfo capabilities) { PrintAttributes defaults = capabilities.getDefaults(); + // Sort the media sizes based on the current locale. + List<MediaSize> sortedMediaSizes = new ArrayList<MediaSize>( + capabilities.getMediaSizes()); + Collections.sort(sortedMediaSizes, mMediaSizeComparator); + // Media size. MediaSize currMediaSize = mCurrPrintAttributes.getMediaSize(); if (currMediaSize == null) { mCurrPrintAttributes.setMediaSize(defaults.getMediaSize()); } else { MediaSize currMediaSizePortrait = currMediaSize.asPortrait(); - List<MediaSize> mediaSizes = capabilities.getMediaSizes(); - final int mediaSizeCount = mediaSizes.size(); + final int mediaSizeCount = sortedMediaSizes.size(); for (int i = 0; i < mediaSizeCount; i++) { - MediaSize mediaSize = mediaSizes.get(i); + MediaSize mediaSize = sortedMediaSizes.get(i); if (currMediaSizePortrait.equals(mediaSize.asPortrait())) { - mCurrPrintAttributes.setMediaSize(mediaSize); + mCurrPrintAttributes.setMediaSize(currMediaSize); break; } } @@ -1148,6 +1141,7 @@ public class PrintJobConfigActivity extends Activity { public Editor() { // Destination. + mMediaSizeComparator = new MediaSizeComparator(PrintJobConfigActivity.this); mDestinationSpinnerAdapter = new DestinationAdapter(); mDestinationSpinnerAdapter.registerDataSetObserver(new DataSetObserver() { @Override @@ -1222,7 +1216,7 @@ public class PrintJobConfigActivity extends Activity { if (capabilitiesChanged || statusChanged) { // If something changed during update... - if (updateUi()) { + if (updateUi() || !mController.hasPerformedLayout()) { // Update the document. mController.update(); } @@ -1277,10 +1271,6 @@ public class PrintJobConfigActivity extends Activity { showUi(UI_EDITING_PRINT_JOB, null); bindUi(); - - mCurrentPrinter = mDestinationSpinnerAdapter.mFakePdfPrinter; - updatePrintAttributes(mCurrentPrinter.getCapabilities()); - updateUi(); } @@ -1702,54 +1692,13 @@ public class PrintJobConfigActivity extends Activity { } if (!allOptionsEnabled) { - String minCopiesString = String.valueOf(MIN_COPIES); - if (!TextUtils.equals(mCopiesEditText.getText(), minCopiesString)) { - mIgnoreNextCopiesChange = true; - mCopiesEditText.setText(minCopiesString); - } mCopiesEditText.setEnabled(false); - - // Media size - if (mMediaSizeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) { - mOldMediaSizeSelectionIndex = AdapterView.INVALID_POSITION; - mMediaSizeSpinner.setSelection(AdapterView.INVALID_POSITION); - } mMediaSizeSpinner.setEnabled(false); - - // Color mode - if (mColorModeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) { - mOldColorModeSelectionIndex = AdapterView.INVALID_POSITION; - mColorModeSpinner.setSelection(AdapterView.INVALID_POSITION); - } mColorModeSpinner.setEnabled(false); - - // Orientation - if (mOrientationSpinner.getSelectedItemPosition() != 0) { - mIgnoreNextOrientationChange = true; - mOrientationSpinner.setSelection(0); - } mOrientationSpinner.setEnabled(false); - - // Range - if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { - mIgnoreNextRangeOptionChange = true; - mRangeOptionsSpinner.setSelection(0); - } mRangeOptionsSpinner.setEnabled(false); - mRangeOptionsTitle.setText(getString(R.string.label_pages, - getString(R.string.page_count_unknown))); - if (!TextUtils.equals(mPageRangeEditText.getText(), "")) { - mIgnoreNextRangeChange = true; - mPageRangeEditText.setText(""); - } - mPageRangeEditText.setEnabled(false); - mPageRangeEditText.setVisibility(View.INVISIBLE); - mPageRangeTitle.setVisibility(View.INVISIBLE); - - // Print mPrintButton.setEnabled(false); - return false; } else { boolean someAttributeSelectionChanged = false; @@ -1759,7 +1708,9 @@ public class PrintJobConfigActivity extends Activity { PrintAttributes defaultAttributes = printer.getCapabilities().getDefaults(); // Media size. - List<MediaSize> mediaSizes = capabilities.getMediaSizes(); + // Sort the media sizes based on the current locale. + List<MediaSize> mediaSizes = new ArrayList<MediaSize>(capabilities.getMediaSizes()); + Collections.sort(mediaSizes, mMediaSizeComparator); // If the media sizes changed, we update the adapter and the spinner. boolean mediaSizesChanged = false; @@ -1783,7 +1734,7 @@ public class PrintJobConfigActivity extends Activity { mMediaSizeSpinnerAdapter.clear(); for (int i = 0; i < mediaSizeCount; i++) { MediaSize mediaSize = mediaSizes.get(i); - if (mediaSize.equals(oldMediaSize)) { + if (mediaSize.asPortrait().equals(oldMediaSize.asPortrait())) { // Update the index of the old selection. oldMediaSizeNewIndex = i; } @@ -1801,8 +1752,13 @@ public class PrintJobConfigActivity extends Activity { final int mediaSizeIndex = Math.max(mediaSizes.indexOf( defaultAttributes.getMediaSize()), 0); setMediaSizeSpinnerSelectionNoCallback(mediaSizeIndex); - mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter - .getItem(mediaSizeIndex).value); + if (oldMediaSize.isPortrait()) { + mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter + .getItem(mediaSizeIndex).value.asPortrait()); + } else { + mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter + .getItem(mediaSizeIndex).value.asLandscape()); + } someAttributeSelectionChanged = true; } } @@ -1904,18 +1860,17 @@ public class PrintJobConfigActivity extends Activity { } } final int pageCount = mDocument.info.getPageCount(); - mRangeOptionsTitle.setText(getString(R.string.label_pages, - (pageCount == PrintDocumentInfo.PAGE_COUNT_UNKNOWN) - ? getString(R.string.page_count_unknown) - : String.valueOf(pageCount))); + String title = (pageCount != PrintDocumentInfo.PAGE_COUNT_UNKNOWN) + ? getString(R.string.label_pages, String.valueOf(pageCount)) + : getString(R.string.page_count_unknown); + mRangeOptionsTitle.setText(title); } else { if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { mIgnoreNextRangeOptionChange = true; mRangeOptionsSpinner.setSelection(0); } mRangeOptionsSpinner.setEnabled(false); - mRangeOptionsTitle.setText(getString(R.string.label_pages, - getString(R.string.page_count_unknown))); + mRangeOptionsTitle.setText(getString(R.string.page_count_unknown)); mPageRangeEditText.setEnabled(false); mPageRangeEditText.setVisibility(View.INVISIBLE); mPageRangeTitle.setVisibility(View.INVISIBLE); @@ -2044,11 +1999,10 @@ public class PrintJobConfigActivity extends Activity { implements LoaderManager.LoaderCallbacks<List<PrinterInfo>>{ private final List<PrinterInfo> mPrinters = new ArrayList<PrinterInfo>(); - private final PrinterInfo mFakePdfPrinter; + private PrinterInfo mFakePdfPrinter; public DestinationAdapter() { getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this); - mFakePdfPrinter = createFakePdfPrinter(); } public int getPrinterIndex(PrinterId printerId) { @@ -2082,7 +2036,9 @@ public class PrintJobConfigActivity extends Activity { @Override public int getCount() { - return Math.min(mPrinters.size() + 2, DEST_ADAPTER_MAX_ITEM_COUNT); + final int additionalItemCount = (mFakePdfPrinter != null) ? 2 : 1; + return Math.min(mPrinters.size() + additionalItemCount, + DEST_ADAPTER_MAX_ITEM_COUNT); } @Override @@ -2098,14 +2054,14 @@ public class PrintJobConfigActivity extends Activity { @Override public Object getItem(int position) { if (mPrinters.isEmpty()) { - if (position == 0) { + if (position == 0 && mFakePdfPrinter != null) { return mFakePdfPrinter; } } else { if (position < 1) { return mPrinters.get(position); } - if (position == 1) { + if (position == 1 && mFakePdfPrinter != null) { return mFakePdfPrinter; } if (position < getCount() - 1) { @@ -2118,14 +2074,14 @@ public class PrintJobConfigActivity extends Activity { @Override public long getItemId(int position) { if (mPrinters.isEmpty()) { - if (position == 0) { + if (position == 0 && mFakePdfPrinter != null) { return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF; } if (position == 1) { return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS; } } else { - if (position == 1) { + if (position == 1 && mFakePdfPrinter != null) { return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF; } if (position == getCount() - 1) { @@ -2157,14 +2113,14 @@ public class PrintJobConfigActivity extends Activity { Drawable icon = null; if (mPrinters.isEmpty()) { - if (position == 0) { + if (position == 0 && mFakePdfPrinter != null) { PrinterInfo printer = (PrinterInfo) getItem(position); title = printer.getName(); } else if (position == 1) { title = getString(R.string.all_printers); } } else { - if (position == 1) { + if (position == 1 && mFakePdfPrinter != null) { PrinterInfo printer = (PrinterInfo) getItem(position); title = printer.getName(); } else if (position == getCount() - 1) { @@ -2217,6 +2173,16 @@ public class PrintJobConfigActivity extends Activity { @Override public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) { + // If this is the first load, create the fake PDF printer. + // We do this to avoid flicker where the PDF printer is the + // only one and as soon as the loader loads the favorites + // it gets switched. Not a great user experience. + if (mFakePdfPrinter == null) { + mCurrentPrinter = mFakePdfPrinter = createFakePdfPrinter(); + updatePrintAttributes(mCurrentPrinter.getCapabilities()); + updateUi(); + } + // We rearrange the printers if the user selects a printer // not shown in the initial short list. Therefore, we have // to keep the printer order. @@ -2266,31 +2232,33 @@ public class PrintJobConfigActivity extends Activity { notifyDataSetInvalidated(); } + private PrinterInfo createFakePdfPrinter() { - final MediaSize defaultMediaSize; - String currentCountry = getResources().getConfiguration().locale.getCountry(); - if (sLetterDefaultCountries.contains(currentCountry)) { - defaultMediaSize = MediaSize.NA_LETTER; - } else { - defaultMediaSize = MediaSize.ISO_A4; - } + MediaSize defaultMediaSize = MediaSizeUtils.getDefault(PrintJobConfigActivity.this); PrinterId printerId = new PrinterId(getComponentName(), "PDF printer"); - PrinterCapabilitiesInfo capabilities = - new PrinterCapabilitiesInfo.Builder(printerId) - .addMediaSize(MediaSize.ISO_A4, MediaSize.ISO_A4 == defaultMediaSize) - .addMediaSize(MediaSize.NA_LETTER, MediaSize.NA_LETTER == defaultMediaSize) - .addResolution(new Resolution("PDF resolution", "PDF resolution", - 300, 300), true) - .setColorModes(PrintAttributes.COLOR_MODE_COLOR - | PrintAttributes.COLOR_MODE_MONOCHROME, - PrintAttributes.COLOR_MODE_COLOR) - .build(); + PrinterCapabilitiesInfo.Builder builder = + new PrinterCapabilitiesInfo.Builder(printerId); + + String[] mediaSizeIds = getResources().getStringArray( + R.array.pdf_printer_media_sizes); + final int mediaSizeIdCount = mediaSizeIds.length; + for (int i = 0; i < mediaSizeIdCount; i++) { + String id = mediaSizeIds[i]; + MediaSize mediaSize = MediaSize.getStandardMediaSizeById(id); + builder.addMediaSize(mediaSize, mediaSize.equals(defaultMediaSize)); + } + + builder.addResolution(new Resolution("PDF resolution", "PDF resolution", + 300, 300), true); + builder.setColorModes(PrintAttributes.COLOR_MODE_COLOR + | PrintAttributes.COLOR_MODE_MONOCHROME, + PrintAttributes.COLOR_MODE_COLOR); return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf), PrinterInfo.STATUS_IDLE) - .setCapabilities(capabilities) + .setCapabilities(builder.build()) .build(); } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java index 114c1515886f..b8a9417a2faa 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java +++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java @@ -36,6 +36,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -43,6 +44,7 @@ import android.print.PrintManager; import android.print.PrinterId; import android.print.PrinterInfo; import android.printservice.PrintServiceInfo; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.Menu; @@ -80,6 +82,8 @@ public final class SelectPrinterFragment extends ListFragment { private final ArrayList<PrintServiceInfo> mAddPrinterServices = new ArrayList<PrintServiceInfo>(); + private AnnounceFilterResult mAnnounceFilterResult; + public static interface OnPrinterSelectedListener { public void onPrinterSelected(PrinterId printerId); } @@ -93,9 +97,23 @@ public final class SelectPrinterFragment extends ListFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - setListAdapter(new DestinationAdapter()); - View emptyView = getActivity().findViewById(R.id.empty_print_state); - getListView().setEmptyView(emptyView); + final DestinationAdapter adapter = new DestinationAdapter(); + adapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + if (!getActivity().isFinishing() && adapter.getCount() <= 0) { + updateEmptyView(adapter); + } + } + + @Override + public void onInvalidated() { + if (!getActivity().isFinishing()) { + updateEmptyView(adapter); + } + } + }); + setListAdapter(adapter); } @Override @@ -117,6 +135,18 @@ public final class SelectPrinterFragment extends ListFragment { return true; } }); + searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + view.announceForAccessibility(getString( + R.string.print_search_box_shown_utterance)); + } + @Override + public void onViewDetachedFromWindow(View view) { + view.announceForAccessibility(getString( + R.string.print_search_box_hidden_utterance)); + } + }); if (mAddPrinterServices.isEmpty()) { menu.removeItem(R.id.action_add_printer); @@ -213,10 +243,32 @@ public final class SelectPrinterFragment extends ListFragment { transaction.commit(); } + public void updateEmptyView(DestinationAdapter adapter) { + if (getListView().getEmptyView() == null) { + View emptyView = getActivity().findViewById(R.id.empty_print_state); + getListView().setEmptyView(emptyView); + } + TextView titleView = (TextView) getActivity().findViewById(R.id.title); + View progressBar = getActivity().findViewById(R.id.progress_bar); + if (adapter.getUnfilteredCount() <= 0) { + titleView.setText(R.string.print_searching_for_printers); + progressBar.setVisibility(View.VISIBLE); + } else { + titleView.setText(R.string.print_no_printers); + progressBar.setVisibility(View.GONE); + } + } + + private void announceSearchResult() { + if (mAnnounceFilterResult == null) { + mAnnounceFilterResult = new AnnounceFilterResult(); + } + mAnnounceFilterResult.post(); + } + public static class AddPrinterAlertDialogFragment extends DialogFragment { - private static final String DEFAULT_MARKET_QUERY_STRING = - "market://search?q=print"; + private String mAddPrintServiceItem; @Override @SuppressWarnings("unchecked") @@ -227,47 +279,56 @@ public final class SelectPrinterFragment extends ListFragment { final List<PrintServiceInfo> printServices = (List<PrintServiceInfo>) (List<?>) getArguments().getParcelableArrayList(FRAGMRNT_ARGUMENT_PRINT_SERVICE_INFOS); - ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), - android.R.layout.simple_list_item_1); + final ArrayAdapter<String> adapter = new ArrayAdapter<String>( + getActivity(), android.R.layout.simple_list_item_1); final int printServiceCount = printServices.size(); for (int i = 0; i < printServiceCount; i++) { PrintServiceInfo printService = printServices.get(i); adapter.add(printService.getResolveInfo().loadLabel( getActivity().getPackageManager()).toString()); } + final String searchUri = Settings.Secure.getString(getActivity().getContentResolver(), + Settings.Secure.PRINT_SERVICE_SEARCH_URI); + final Intent marketIntent; + if (!TextUtils.isEmpty(searchUri)) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(searchUri)); + if (getActivity().getPackageManager().resolveActivity(intent, 0) != null) { + marketIntent = intent; + mAddPrintServiceItem = getString(R.string.add_print_service_label); + adapter.add(mAddPrintServiceItem); + } else { + marketIntent = null; + } + } else { + marketIntent = null; + } builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - PrintServiceInfo printService = printServices.get(which); - ComponentName componentName = new ComponentName( - printService.getResolveInfo().serviceInfo.packageName, - printService.getAddPrintersActivityName()); - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setComponent(componentName); - try { - startActivity(intent); - } catch (ActivityNotFoundException anfe) { - Log.w(LOG_TAG, "Couldn't start settings activity", anfe); + String item = adapter.getItem(which); + if (item == mAddPrintServiceItem) { + try { + startActivity(marketIntent); + } catch (ActivityNotFoundException anfe) { + Log.w(LOG_TAG, "Couldn't start add printer activity", anfe); + } + } else { + PrintServiceInfo printService = printServices.get(which); + ComponentName componentName = new ComponentName( + printService.getResolveInfo().serviceInfo.packageName, + printService.getAddPrintersActivityName()); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setComponent(componentName); + try { + startActivity(intent); + } catch (ActivityNotFoundException anfe) { + Log.w(LOG_TAG, "Couldn't start settings activity", anfe); + } } } }); - Uri marketUri = Uri.parse(DEFAULT_MARKET_QUERY_STRING); - final Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); - if (getActivity().getPackageManager().resolveActivity(marketIntent, 0) != null) { - builder.setPositiveButton(R.string.add_print_service_label, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - try { - startActivity(marketIntent); - } catch (ActivityNotFoundException anfe) { - Log.w(LOG_TAG, "Couldn't start add printer activity", anfe); - } - } - }); - } - return builder.create(); } } @@ -315,7 +376,9 @@ public final class SelectPrinterFragment extends ListFragment { @Override @SuppressWarnings("unchecked") protected void publishResults(CharSequence constraint, FilterResults results) { + final boolean resultCountChanged; synchronized (mLock) { + final int oldPrinterCount = mFilteredPrinters.size(); mLastSearchString = constraint; mFilteredPrinters.clear(); if (results == null) { @@ -324,12 +387,22 @@ public final class SelectPrinterFragment extends ListFragment { List<PrinterInfo> printers = (List<PrinterInfo>) results.values; mFilteredPrinters.addAll(printers); } + resultCountChanged = (oldPrinterCount != mFilteredPrinters.size()); + } + if (resultCountChanged) { + announceSearchResult(); } notifyDataSetChanged(); } }; } + public int getUnfilteredCount() { + synchronized (mLock) { + return mPrinters.size(); + } + } + @Override public int getCount() { synchronized (mLock) { @@ -434,4 +507,30 @@ public final class SelectPrinterFragment extends ListFragment { notifyDataSetInvalidated(); } } + + private final class AnnounceFilterResult implements Runnable { + private static final int SEARCH_RESULT_ANNOUNCEMENT_DELAY = 1000; // 1 sec + + public void post() { + remove(); + getListView().postDelayed(this, SEARCH_RESULT_ANNOUNCEMENT_DELAY); + } + + public void remove() { + getListView().removeCallbacks(this); + } + + @Override + public void run() { + final int count = getListView().getAdapter().getCount(); + final String text; + if (count <= 0) { + text = getString(R.string.print_no_printers); + } else { + text = getActivity().getResources().getQuantityString( + R.plurals.print_search_result_count_utterance, count, count); + } + getListView().announceForAccessibility(text); + } + } } diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png Binary files differindex ece947a619c1..6f48fe89889d 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png Binary files differindex be153d1387a4..f32522016b6c 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png Binary files differindex 7570610b8d6d..189f27b3a682 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png Binary files differindex cf510b4d98cd..02d7fdaa7aec 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_remote_display.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png Binary files differindex 6ff215b4aaf0..250653b61355 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png Binary files differindex cf5e825df48a..497c69f4b637 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png Binary files differindex c7b035abfa0c..dd8ba8f34240 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png Binary files differindex 5d8fd070fb7c..d750726016e4 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png Binary files differindex ebd2001f5edd..250653b61355 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png Binary files differindex cf5e825df48a..497c69f4b637 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png Binary files differindex a5e0bde2d3c8..45bc3763d22f 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png Binary files differindex 5d8fd070fb7c..d750726016e4 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-hdpi/search_light.png b/packages/SystemUI/res/drawable-hdpi/search_light.png Binary files differindex c8b5a2ec9295..c64ae19777f8 100644 --- a/packages/SystemUI/res/drawable-hdpi/search_light.png +++ b/packages/SystemUI/res/drawable-hdpi/search_light.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png Binary files differindex 7db72fbe63a5..c36809b59cd8 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png Binary files differnew file mode 100644 index 000000000000..64c6723622be --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png Binary files differnew file mode 100644 index 000000000000..23381227dd06 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png Binary files differnew file mode 100644 index 000000000000..29df6d7b8235 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png Binary files differindex 5ba15a756f10..084799ada9f8 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png Binary files differnew file mode 100644 index 000000000000..3fba731e3475 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png Binary files differnew file mode 100644 index 000000000000..eb5fcd0711bd --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png Binary files differnew file mode 100644 index 000000000000..a91c7c7827a7 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png Binary files differindex 294ae4826cc2..714f07ef74bd 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png Binary files differnew file mode 100644 index 000000000000..521de1269b27 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png Binary files differnew file mode 100644 index 000000000000..4d015dad1c8e --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png Binary files differnew file mode 100644 index 000000000000..d8209e637899 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png Binary files differindex 7b7e329e10c4..6fc556dd4b9e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png Binary files differnew file mode 100644 index 000000000000..3725b3f08d51 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png Binary files differnew file mode 100644 index 000000000000..b72a2746f8f6 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png Binary files differnew file mode 100644 index 000000000000..aa2de43b2c30 --- /dev/null +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png Binary files differindex 8ab2e1e250f5..95df4d455986 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png Binary files differindex 426b33dfc4c9..541e80176c7c 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png Binary files differindex 7c73ace10f63..b692107c0c35 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png Binary files differindex 8e080ff42a04..09ae4095d6c2 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_remote_display.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png Binary files differindex da4ffa277a9f..4a2119ffbc0c 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png Binary files differindex e1c797260804..a53d76439a84 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png Binary files differindex 9441f61aa70f..59221612826b 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png Binary files differindex b8c8b4e8838c..8b7251bb094d 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png Binary files differindex 5d0ad7c05681..4a2119ffbc0c 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png Binary files differindex e1c797260804..a53d76439a84 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png Binary files differindex 7208427bee2d..535a4fdc3be6 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png Binary files differindex b8c8b4e8838c..8b7251bb094d 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-mdpi/search_light.png b/packages/SystemUI/res/drawable-mdpi/search_light.png Binary files differindex 4b5b2a495a14..fb990617d032 100644 --- a/packages/SystemUI/res/drawable-mdpi/search_light.png +++ b/packages/SystemUI/res/drawable-mdpi/search_light.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png Binary files differindex 32e6c49fea9a..4411097d378a 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png Binary files differindex 273f363c24f3..c798fd654955 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png Binary files differindex 466470ca4c82..7ce8f83e283d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png Binary files differindex 92c6df0b447c..48f90ac09dd1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_remote_display.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png Binary files differindex 46fd826dfb25..16646888cec8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png Binary files differindex c824b9760fa2..b38e3ef7586d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png Binary files differindex 43a7d82bd8f2..48650c71d305 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png Binary files differindex fb9ecd01f399..c6458593c542 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png Binary files differindex 6cf0a4b2e815..16646888cec8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png Binary files differindex c824b9760fa2..b38e3ef7586d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png Binary files differindex 22e0f8cec25f..b86f140ae22b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png Binary files differindex fb9ecd01f399..c6458593c542 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-xhdpi/search_light.png b/packages/SystemUI/res/drawable-xhdpi/search_light.png Binary files differindex 3aa890fdfa8b..438970767456 100644 --- a/packages/SystemUI/res/drawable-xhdpi/search_light.png +++ b/packages/SystemUI/res/drawable-xhdpi/search_light.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png Binary files differindex 3d3c9bb5465e..65b02043e7b9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png Binary files differindex ca1aef0a98ab..1045e0745150 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png Binary files differindex 920407d239c2..c14c1bbea197 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png Binary files differindex 5f6231ceb482..b07be828f369 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_remote_display.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png Binary files differindex 1094bc31a5a8..3725b3f08d51 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png Binary files differindex 1037b02bef4b..b72a2746f8f6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png Binary files differindex d2e27d902701..9755011d115e 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png Binary files differindex f5595e3b79b3..aa2de43b2c30 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png Binary files differindex 7183a07cbb8e..5b808932efe0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png Binary files differindex 374632860f71..21b2118dded2 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png Binary files differindex 83402ff67004..9bbb359b182d 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png Binary files differindex dbf54ce62a0b..3f0447df467f 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/search_light.png b/packages/SystemUI/res/drawable-xxhdpi/search_light.png Binary files differindex 74ad3c832485..b4fa29777916 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/search_light.png +++ b/packages/SystemUI/res/drawable-xxhdpi/search_light.png diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml index b06166d867e0..b2ba25a38bd7 100644 --- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml @@ -41,15 +41,15 @@ android:fadingEdge="horizontal" android:scrollbars="none" android:layout_gravity="right" - android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length" - android:fitsSystemWindows="true"> + android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length"> <LinearLayout android:id="@+id/recents_linear_layout" android:layout_width="wrap_content" android:layout_height="match_parent" android:layoutDirection="ltr" android:layout_gravity="left" - android:orientation="horizontal"> + android:orientation="horizontal" + android:fitsSystemWindows="true"> </LinearLayout> </com.android.systemui.recent.RecentsHorizontalScrollView> diff --git a/packages/SystemUI/res/layout/status_bar_recent_panel.xml b/packages/SystemUI/res/layout/status_bar_recent_panel.xml index 305aaf2b9133..e41475b41a56 100644 --- a/packages/SystemUI/res/layout/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout/status_bar_recent_panel.xml @@ -45,13 +45,13 @@ android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length" android:layout_gravity="bottom|start" android:clipToPadding="false" - android:clipChildren="false" - android:fitsSystemWindows="true"> + android:clipChildren="false"> <LinearLayout android:id="@+id/recents_linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:fitsSystemWindows="true" android:clipToPadding="false" android:clipChildren="false"> </LinearLayout> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 36ff0fa2a76c..2ab8cbe82437 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -29,9 +29,9 @@ <item quantity="one" msgid="5854176083865845541">"تطبيق حديث واحد"</item> <item quantity="other" msgid="1040784359794890744">"%d من التطبيقات الحديثة"</item> </plurals> - <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string> + <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي اشعارات"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string> - <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string> + <string name="status_bar_latest_events_title" msgid="6594767438577593172">"الإشعارات"</string> <string name="battery_low_title" msgid="2783104807551211639">"توصيل الشاحن"</string> <string name="battery_low_subtitle" msgid="1752040062087829196">"انخفضت طاقة البطارية."</string> <string name="battery_low_percent_format" msgid="1077244949318261761">"المتبقي: <xliff:g id="NUMBER">%d%%</xliff:g>"</string> @@ -43,7 +43,7 @@ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"التدوير التلقائي للشاشة"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"كتم"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"تلقائي"</string> - <string name="status_bar_settings_notifications" msgid="397146176280905137">"التنبيهات"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"الإشعارات"</string> <string name="bluetooth_tethered" msgid="7094101612161133267">"تم إنشاء الاتصال بالإنترنت عن طريق البلوتوث."</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"إعداد أسلوب الإدخال"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"لوحة مفاتيح فعلية"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 310b0289d70a..25c5baa00b20 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -44,7 +44,7 @@ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> <string name="status_bar_settings_notifications" msgid="397146176280905137">"Underretninger"</string> - <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-tethering anvendt"</string> + <string name="bluetooth_tethered" msgid="7094101612161133267">"Netdeling via Bluetooth anvendt"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Konfigurer inputmetoder"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fysisk tastatur"</string> <string name="usb_device_permission_prompt" msgid="834698001271562057">"Tillad, at appen <xliff:g id="APPLICATION">%1$s</xliff:g> kan få adgang til USB-enheden?"</string> @@ -73,7 +73,7 @@ <string name="use_ptp_button_title" msgid="7517127540301625751">"Isæt som et kamera (PTP)"</string> <string name="installer_cd_button_title" msgid="2312667578562201583">"Installer appen Android Filoverførsel til Mac"</string> <string name="accessibility_back" msgid="567011538994429120">"Tilbage"</string> - <string name="accessibility_home" msgid="8217216074895377641">"Startside"</string> + <string name="accessibility_home" msgid="8217216074895377641">"Startskærm"</string> <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string> <string name="accessibility_recent" msgid="8571350598987952883">"Seneste apps"</string> <string name="accessibility_search_light" msgid="1103867596330271848">"Søg"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 8c07a3129537..da958bf785a0 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -179,7 +179,7 @@ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> उपकरण)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth बंद"</string> - <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string> + <string name="quick_settings_brightness_label" msgid="6968372297018755815">"स्क्रीन की रोशनी"</string> <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"स्वत: रोटेट"</string> <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"रोटेशन लॉक किया गया"</string> <string name="quick_settings_ime_label" msgid="7073463064369468429">"इनपुट विधि"</string> @@ -197,7 +197,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बंद"</string> <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi प्रदर्शन"</string> <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"वायरलेस डिस्प्ले"</string> - <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"चमक"</string> + <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"स्क्रीन की रोशनी"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वत:"</string> <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"नेटवर्क को\nमॉनीटर किया जा सकता है"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 91580540c7bc..d833ec1a4776 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -116,8 +116,8 @@ <string name="accessibility_two_bars" msgid="6437363648385206679">"Due barre."</string> <string name="accessibility_three_bars" msgid="2648241415119396648">"Tre barre."</string> <string name="accessibility_signal_full" msgid="9122922886519676839">"Massimo segnale."</string> - <string name="accessibility_desc_on" msgid="2385254693624345265">"Attivo."</string> - <string name="accessibility_desc_off" msgid="6475508157786853157">"Non attivo."</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"ON"</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"OFF"</string> <string name="accessibility_desc_connected" msgid="8366256693719499665">"Connesso."</string> <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string> <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 7ccf6d8ebacb..7c7f6619d129 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -182,7 +182,7 @@ <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Mzunguko Umefungwa"</string> <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu ya uingizaji"</string> <string name="quick_settings_location_label" msgid="5011327048748762257">"Kutambua Eneo"</string> - <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Eneo Limezimwa"</string> + <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Kitambua eneo kimezimwa"</string> <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha midia"</string> <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string> <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Simu za Dharura Pekee"</string> diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java index 818c2980f33b..09a7a5e008a8 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java @@ -177,10 +177,14 @@ public class RecentsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + getWindow().addPrivateFlags( + WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR); setContentView(R.layout.status_bar_recent_panel); mRecentsPanel = (RecentsPanelView) findViewById(R.id.recents_root); mRecentsPanel.setOnTouchListener(new TouchOutsideListener(mRecentsPanel)); - mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); final RecentTasksLoader recentTasksLoader = RecentTasksLoader.getInstance(this); recentTasksLoader.setRecentsPanel(mRecentsPanel, mRecentsPanel); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index ce578e522f57..7b1df91e6bd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -35,7 +35,7 @@ public class BarTransitions { public static final int MODE_OPAQUE = 0; public static final int MODE_SEMI_TRANSPARENT = 1; - public static final int MODE_TRANSPARENT = 2; + public static final int MODE_TRANSLUCENT = 2; public static final int MODE_LIGHTS_OUT = 3; public static final int LIGHTS_IN_DURATION = 250; @@ -125,7 +125,7 @@ public class BarTransitions { mColorDrawable.setColor(newColor); } } - if (oldColor != null && newColor == null && mColorDrawableShowing) { + if (newColor == null && mColorDrawableShowing) { if (DEBUG) Log.d(mTag, "Hide color layer"); if (animate) { mTransitionDrawable.reverseTransition(BACKGROUND_DURATION); @@ -133,9 +133,8 @@ public class BarTransitions { mTransitionDrawable.resetTransition(); } mColorDrawableShowing = false; - } else if (oldColor == null && newColor != null && !mColorDrawableShowing) { + } else if (newColor != null && !mColorDrawableShowing) { if (DEBUG) Log.d(mTag, "Show color layer"); - mTransitionDrawable.setCrossFadeEnabled(!animate); mTransitionDrawable.startTransition(animate ? BACKGROUND_DURATION : 0); mColorDrawableShowing = true; } @@ -158,7 +157,7 @@ public class BarTransitions { public static String modeToString(int mode) { if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; - if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; + if (mode == MODE_TRANSLUCENT) return "MODE_TRANSLUCENT"; if (mode == MODE_LIGHTS_OUT) return "MODE_LIGHTS_OUT"; throw new IllegalArgumentException("Unknown mode " + mode); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index 4e921791fe4e..5d4b9958f0d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -58,8 +58,8 @@ public final class NavigationBarTransitions extends BarTransitions { @Override public void transitionTo(int mode, boolean animate) { mRequestedMode = mode; - if (mVertical && mode == MODE_TRANSPARENT) { - // fully transparent mode not allowed when vertical + if (mVertical && mode == MODE_TRANSLUCENT) { + // translucent mode not allowed when vertical mode = MODE_OPAQUE; } super.transitionTo(mode, animate); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 04885f0b076f..6e5336384d44 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -391,7 +391,7 @@ public class NavigationBarView extends LinearLayout { final AccessibilityManager accessibilityManager = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); - if (accessibilityManager.isEnabled()) { + if (accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled()) { // In accessibility mode, we add a simple click handler since swipe is tough to // trigger near screen edges. View camera = getCameraButton(); 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 c47d0eb7d60c..93a9b9299002 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -22,7 +22,7 @@ import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.windowStateToString; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; import android.animation.Animator; @@ -1853,12 +1853,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // update status bar mode final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(), - View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS); + View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_TRANSLUCENT); // update navigation bar mode final int nbMode = mNavigationBarView == null ? -1 : computeBarMode( oldVal, newVal, mNavigationBarView.getBarTransitions(), - View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION); + View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_TRANSLUCENT); final boolean sbModeChanged = sbMode != -1; final boolean nbModeChanged = nbMode != -1; boolean checkBarModes = false; @@ -1896,18 +1896,18 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } private int computeBarMode(int oldVis, int newVis, BarTransitions transitions, - int transientFlag, int transparentFlag) { - final int oldMode = barMode(oldVis, transientFlag, transparentFlag); - final int newMode = barMode(newVis, transientFlag, transparentFlag); + int transientFlag, int translucentFlag) { + final int oldMode = barMode(oldVis, transientFlag, translucentFlag); + final int newMode = barMode(newVis, transientFlag, translucentFlag); if (oldMode == newMode) { return -1; // no mode change } return newMode; } - private int barMode(int vis, int transientFlag, int transparentFlag) { + private int barMode(int vis, int transientFlag, int translucentFlag) { return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT - : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT + : (vis & translucentFlag) != 0 ? MODE_TRANSLUCENT : (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0 ? MODE_LIGHTS_OUT : MODE_OPAQUE; } @@ -2737,7 +2737,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { if (command.equals(COMMAND_BARS)) { String mode = args.getString("mode"); int barMode = "opaque".equals(mode) ? MODE_OPAQUE : - "transparent".equals(mode) ? MODE_TRANSPARENT : + "translucent".equals(mode) ? MODE_TRANSLUCENT : "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT : -1; if (barMode != -1) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java index 6bb6776d0675..84065659a6dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java @@ -20,13 +20,12 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.res.Resources; -import android.graphics.drawable.GradientDrawable.Orientation; import android.view.View; import com.android.systemui.R; public final class PhoneStatusBarTransitions extends BarTransitions { - private static final float ICON_ALPHA_WHEN_TRANSPARENT = 1; + private static final float ICON_ALPHA_WHEN_NOT_OPAQUE = 1; private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_BATTERY_CLOCK = 0.5f; private static final float ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK = 0; @@ -59,7 +58,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { private float getNonBatteryClockAlphaFor(int mode) { return mode == MODE_LIGHTS_OUT ? ICON_ALPHA_WHEN_LIGHTS_OUT_NON_BATTERY_CLOCK - : isTransparent(mode) ? ICON_ALPHA_WHEN_TRANSPARENT + : !isOpaque(mode) ? ICON_ALPHA_WHEN_NOT_OPAQUE : mIconAlphaWhenOpaque; } @@ -68,8 +67,8 @@ public final class PhoneStatusBarTransitions extends BarTransitions { : getNonBatteryClockAlphaFor(mode); } - private boolean isTransparent(int mode) { - return mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; + private boolean isOpaque(int mode) { + return !(mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSLUCENT); } @Override diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java index 57c9675f3868..8d97fc8eb028 100644 --- a/policy/src/com/android/internal/policy/impl/BarController.java +++ b/policy/src/com/android/internal/policy/impl/BarController.java @@ -23,6 +23,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.util.Slog; import android.view.View; +import android.view.WindowManager; import android.view.WindowManagerPolicy.WindowState; import com.android.internal.statusbar.IStatusBarService; @@ -39,13 +40,14 @@ public class BarController { private static final int TRANSIENT_BAR_SHOWING = 1; private static final int TRANSIENT_BAR_HIDING = 2; - private static final int TRANSPARENT_ANIMATION_DELAY_MS = 1000; + private static final int TRANSLUCENT_ANIMATION_DELAY_MS = 1000; private final String mTag; private final int mTransientFlag; private final int mUnhideFlag; - private final int mTransparentFlag; + private final int mTranslucentFlag; private final int mStatusBarManagerId; + private final int mTranslucentWmFlag; private final Handler mHandler; private final Object mServiceAquireLock = new Object(); private IStatusBarService mStatusBarService; @@ -54,15 +56,16 @@ public class BarController { private int mState = StatusBarManager.WINDOW_STATE_SHOWING; private int mTransientBarState; private boolean mPendingShow; - private long mLastTransparent; + private long mLastTranslucent; - public BarController(String tag, int transientFlag, int unhideFlag, int transparentFlag, - int statusBarManagerId) { + public BarController(String tag, int transientFlag, int unhideFlag, int translucentFlag, + int statusBarManagerId, int translucentWmFlag) { mTag = "BarController." + tag; mTransientFlag = transientFlag; mUnhideFlag = unhideFlag; - mTransparentFlag = transparentFlag; + mTranslucentFlag = translucentFlag; mStatusBarManagerId = statusBarManagerId; + mTranslucentWmFlag = translucentWmFlag; mHandler = new Handler(); } @@ -84,8 +87,8 @@ public class BarController { return mTransientBarState == TRANSIENT_BAR_SHOWING; } - public boolean wasRecentlyTransparent() { - return (SystemClock.uptimeMillis() - mLastTransparent) < TRANSPARENT_ANIMATION_DELAY_MS; + public boolean wasRecentlyTranslucent() { + return (SystemClock.uptimeMillis() - mLastTranslucent) < TRANSLUCENT_ANIMATION_DELAY_MS; } public void adjustSystemUiVisibilityLw(int oldVis, int vis) { @@ -100,6 +103,22 @@ public class BarController { } } + public int applyTranslucentFlagLw(WindowState win, int vis, int oldVis) { + if (mWin != null) { + if (win != null && (win.getAttrs().privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) == 0) { + if ((win.getAttrs().flags & mTranslucentWmFlag) != 0) { + vis |= mTranslucentFlag; + } else { + vis &= ~mTranslucentFlag; + } + } else { + vis = (vis & ~mTranslucentFlag) | (oldVis & mTranslucentFlag); + } + } + return vis; + } + public boolean setBarShowingLw(final boolean show) { if (mWin == null) return false; if (show && mTransientBarState == TRANSIENT_BAR_HIDING) { @@ -186,10 +205,10 @@ public class BarController { } } - public int updateVisibilityLw(boolean allowed, int oldVis, int vis) { + public int updateVisibilityLw(boolean transientAllowed, int oldVis, int vis) { if (mWin == null) return vis; if (mTransientBarState == TRANSIENT_BAR_SHOWING) { // transient bar requested - if (allowed) { + if (transientAllowed) { vis |= mTransientFlag; if ((oldVis & mTransientFlag) == 0) { vis |= mUnhideFlag; // tell sysui we're ready to unhide @@ -202,8 +221,8 @@ public class BarController { vis |= mTransientFlag; // ignore clear requests until transition completes vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; // never show transient bars in low profile } - if ((vis & mTransparentFlag) != 0 || (oldVis & mTransparentFlag) != 0) { - mLastTransparent = SystemClock.uptimeMillis(); + if ((vis & mTranslucentFlag) != 0 || (oldVis & mTranslucentFlag) != 0) { + mLastTranslucent = SystemClock.uptimeMillis(); } return vis; } @@ -211,7 +230,7 @@ public class BarController { private void setTransientBarState(int state) { if (mWin != null && state != mTransientBarState) { if (mTransientBarState == TRANSIENT_BAR_SHOWING || state == TRANSIENT_BAR_SHOWING) { - mLastTransparent = SystemClock.uptimeMillis(); + mLastTranslucent = SystemClock.uptimeMillis(); } mTransientBarState = state; if (DEBUG) Slog.d(mTag, "mTransientBarState: " + transientBarStateToString(state)); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 11913ee5ee4a..d8af0072e98b 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -2750,6 +2750,18 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags())); } + if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentStatus, + false)) { + setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS + & (~getForcedWindowFlags())); + } + + if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentNavigation, + false)) { + setFlags(FLAG_TRANSLUCENT_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION + & (~getForcedWindowFlags())); + } + if (a.getBoolean(com.android.internal.R.styleable.Window_windowOverscan, false)) { setFlags(FLAG_LAYOUT_IN_OVERSCAN, FLAG_LAYOUT_IN_OVERSCAN&(~getForcedWindowFlags())); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 3232a1ea0ffb..dd4f3d1f9be3 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -163,9 +163,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { */ static final int SYSTEM_UI_CHANGING_LAYOUT = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; + | View.SYSTEM_UI_FLAG_FULLSCREEN; /** * Keyguard stuff @@ -557,14 +555,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { private final BarController mStatusBarController = new BarController("StatusBar", View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_UNHIDE, - View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS, - StatusBarManager.WINDOW_STATUS_BAR); + View.STATUS_BAR_TRANSLUCENT, + StatusBarManager.WINDOW_STATUS_BAR, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); private final BarController mNavigationBarController = new BarController("NavigationBar", View.NAVIGATION_BAR_TRANSIENT, View.NAVIGATION_BAR_UNHIDE, - View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION, - StatusBarManager.WINDOW_NAVIGATION_BAR); + View.NAVIGATION_BAR_TRANSLUCENT, + StatusBarManager.WINDOW_NAVIGATION_BAR, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); private TransientNavigationConfirmation mTransientNavigationConfirmation; @@ -2694,9 +2694,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { // drive nav being hidden only by whether it is requested. final int sysui = mLastSystemUiFlags; boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; - boolean navTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) != 0; + boolean navTranslucent = (sysui & View.NAVIGATION_BAR_TRANSLUCENT) != 0; boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; - navTransparent &= !transientAllowed; // transient trumps transparent + navTranslucent &= !transientAllowed; // transient trumps translucent // When the navigation bar isn't visible, we put up a fake // input window to catch all touch events. This way we can @@ -2733,7 +2733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { - mNavigationBarHeightForRotation[displayRotation]; mTmpNavigationFrame.set(0, top, displayWidth, displayHeight - overscanBottom); mStableBottom = mStableFullscreenBottom = mTmpNavigationFrame.top; - if (transientNavBarShowing || navTransparent) { + if (transientNavBarShowing || navTranslucent) { mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { mNavigationBarController.setBarShowingLw(true); @@ -2744,8 +2744,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBarController.setBarShowingLw(false); } - if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw() - && !mNavigationBarController.wasRecentlyTransparent()) { + if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw() + && !mNavigationBarController.wasRecentlyTranslucent()) { // If the opaque nav bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2757,7 +2757,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { - mNavigationBarWidthForRotation[displayRotation]; mTmpNavigationFrame.set(left, 0, displayWidth - overscanRight, displayHeight); mStableRight = mStableFullscreenRight = mTmpNavigationFrame.left; - if (transientNavBarShowing || navTransparent) { + if (transientNavBarShowing || navTranslucent) { mNavigationBarController.setBarShowingLw(true); } else if (navVisible) { mNavigationBarController.setBarShowingLw(true); @@ -2768,8 +2768,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We currently want to hide the navigation UI. mNavigationBarController.setBarShowingLw(false); } - if (navVisible && !navTransparent && !mNavigationBar.isAnimatingLw() - && !mNavigationBarController.wasRecentlyTransparent()) { + if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw() + && !mNavigationBarController.wasRecentlyTranslucent()) { // If the nav bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2816,7 +2816,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mStableTop = mUnrestrictedScreenTop + mStatusBarHeight; boolean statusBarTransient = (sysui & View.STATUS_BAR_TRANSIENT) != 0; - boolean statusBarTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) != 0; + boolean statusBarTranslucent = (sysui & View.STATUS_BAR_TRANSLUCENT) != 0; // If the status bar is hidden, we don't want to cause // windows behind it to scroll. @@ -2839,8 +2839,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mCurLeft, mCurTop, mCurRight, mCurBottom)); } if (mStatusBar.isVisibleLw() && !mStatusBar.isAnimatingLw() - && !statusBarTransient && !statusBarTransparent - && !mStatusBarController.wasRecentlyTransparent()) { + && !statusBarTransient && !statusBarTranslucent + && !mStatusBarController.wasRecentlyTranslucent()) { // If the opaque status bar is currently requested to be visible, // and not in the process of animating on or off, then // we can tell the app that it is covered by it. @@ -2999,15 +2999,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { dcf.top = mSystemTop; dcf.right = mSystemRight; dcf.bottom = mSystemBottom; + final boolean inheritTranslucentDecor = (attrs.privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR) != 0; if (attrs.type >= WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW - && attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW) { - if ((attrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0 - && (sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 - && (sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS) == 0) { + && attrs.type <= WindowManager.LayoutParams.LAST_APPLICATION_WINDOW + && !inheritTranslucentDecor) { + if ((sysUiFl & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 + && (fl & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0 + && (fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) == 0) { // Ensure policy decor includes status bar dcf.top = mStableTop; } - if ((sysUiFl & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) == 0 + if ((fl & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0 && (sysUiFl & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { // Ensure policy decor includes navigation bar dcf.bottom = mStableBottom; @@ -3257,6 +3260,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { + mRestrictedScreenWidth; pf.bottom = df.bottom = of.bottom = cf.bottom = mRestrictedScreenTop + mRestrictedScreenHeight; + } else if (attrs.type == TYPE_TOAST || attrs.type == TYPE_SYSTEM_ALERT) { + // Toasts are stable to interim decor changes. + pf.left = df.left = of.left = cf.left = mStableLeft; + pf.top = df.top = of.top = cf.top = mStableTop; + pf.right = df.right = of.right = cf.right = mStableRight; + pf.bottom = df.bottom = of.bottom = cf.bottom = mStableBottom; } else { pf.left = mContentLeft; pf.top = mContentTop; @@ -5061,22 +5070,30 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private int updateSystemBarsLw(WindowState win, int oldVis, int vis) { + // apply translucent bar vis flags + WindowState transWin = mKeyguard != null && mKeyguard.isVisibleLw() && !mHideLockScreen + ? mKeyguard + : mTopFullscreenOpaqueWindowState; + vis = mStatusBarController.applyTranslucentFlagLw(transWin, vis, oldVis); + vis = mNavigationBarController.applyTranslucentFlagLw(transWin, vis, oldVis); + // prevent status bar interaction from clearing certain flags boolean statusBarHasFocus = win.getAttrs().type == TYPE_STATUS_BAR; if (statusBarHasFocus) { int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE - | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS - | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; - vis = (vis & ~flags) | (mLastSystemUiFlags & flags); + | View.STATUS_BAR_TRANSLUCENT + | View.NAVIGATION_BAR_TRANSLUCENT; + vis = (vis & ~flags) | (oldVis & flags); } // update status bar boolean transientAllowed = (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0; boolean hideStatusBarWM = - (win.getAttrs().flags + mTopFullscreenOpaqueWindowState != null && + (mTopFullscreenOpaqueWindowState.getAttrs().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; boolean hideStatusBarSysui = (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; diff --git a/services/java/com/android/server/ConsumerIrService.java b/services/java/com/android/server/ConsumerIrService.java index 07f2a413259d..783dff111443 100644 --- a/services/java/com/android/server/ConsumerIrService.java +++ b/services/java/com/android/server/ConsumerIrService.java @@ -39,6 +39,7 @@ import android.provider.Settings.SettingNotFoundException; import android.util.Slog; import android.view.InputDevice; +import java.lang.RuntimeException; import java.util.ArrayList; import java.util.LinkedList; import java.util.ListIterator; @@ -65,8 +66,12 @@ public class ConsumerIrService extends IConsumerIrService.Stub { mWakeLock.setReferenceCounted(true); mHal = halOpen(); - if (mHal == 0) { - Slog.w(TAG, "No IR HAL loaded"); + if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) { + if (mHal == 0) { + throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!"); + } + } else if (mHal != 0) { + throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!"); } } diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java index 27ca7a05d9c4..b69a0c8185b6 100644 --- a/services/java/com/android/server/am/ActiveServices.java +++ b/services/java/com/android/server/am/ActiveServices.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.List; import android.os.Handler; +import android.os.Looper; import android.util.ArrayMap; import com.android.internal.app.ProcessStats; import com.android.internal.os.BatteryStatsImpl; @@ -166,7 +167,8 @@ public final class ActiveServices { static final int MSG_BG_START_TIMEOUT = 1; - ServiceMap(int userId) { + ServiceMap(Looper looper, int userId) { + super(looper); mUserId = userId; } @@ -255,7 +257,7 @@ public final class ActiveServices { private ServiceMap getServiceMap(int callingUser) { ServiceMap smap = mServiceMap.get(callingUser); if (smap == null) { - smap = new ServiceMap(callingUser); + smap = new ServiceMap(mAm.mHandler.getLooper(), callingUser); mServiceMap.put(callingUser, smap); } return smap; @@ -2417,7 +2419,11 @@ public final class ActiveServices { int[] users = mAm.getUsersLocked(); if ("all".equals(name)) { for (int user : users) { - ArrayMap<ComponentName, ServiceRecord> alls = getServices(user); + ServiceMap smap = mServiceMap.get(user); + if (smap == null) { + continue; + } + ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName; for (int i=0; i<alls.size(); i++) { ServiceRecord r1 = alls.valueAt(i); services.add(r1); @@ -2438,7 +2444,11 @@ public final class ActiveServices { } for (int user : users) { - ArrayMap<ComponentName, ServiceRecord> alls = getServices(user); + ServiceMap smap = mServiceMap.get(user); + if (smap == null) { + continue; + } + ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName; for (int i=0; i<alls.size(); i++) { ServiceRecord r1 = alls.valueAt(i); if (componentName != null) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index f23bcba6f04a..fe91b6c52331 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -3193,6 +3193,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (task.userId == tr.userId && ((task.affinity != null && task.affinity.equals(tr.affinity)) || (task.intent != null && task.intent.filterEquals(tr.intent)))) { + tr.disposeThumbnail(); mRecentTasks.remove(i); i--; N--; @@ -3204,7 +3205,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } if (N >= MAX_RECENT_TASKS) { - mRecentTasks.remove(N-1); + mRecentTasks.remove(N-1).disposeThumbnail(); } mRecentTasks.add(0, task); } @@ -3464,7 +3465,8 @@ public final class ActivityManagerService extends ActivityManagerNative clearProfilerLocked(); } - mStackSupervisor.handleAppDiedLocked(app, restarting); + // Remove this application's activities from active lists. + boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app, restarting); app.activities.clear(); @@ -3475,6 +3477,19 @@ public final class ActivityManagerService extends ActivityManagerNative info.putString("shortMsg", "Process crashed."); finishInstrumentationLocked(app, Activity.RESULT_CANCELED, info); } + + if (!restarting) { + if (!mStackSupervisor.resumeTopActivitiesLocked()) { + // If there was nothing to resume, and we are not already + // restarting this process, but there is a visible activity that + // is hosted by the process... then make sure all visible + // activities are running, taking care of restarting this + // process. + if (hasVisibleActivities) { + mStackSupervisor.ensureActivitiesVisibleLocked(null, 0); + } + } + } } private final int getLRURecordIndexForAppLocked(IApplicationThread thread) { @@ -6738,6 +6753,7 @@ public final class ActivityManagerService extends ActivityManagerNative } private void cleanUpRemovedTaskLocked(TaskRecord tr, int flags) { + tr.disposeThumbnail(); mRecentTasks.remove(tr); mStackSupervisor.removeTask(tr); final boolean killProcesses = (flags&ActivityManager.REMOVE_TASK_KILL_PROCESS) != 0; @@ -15818,9 +15834,11 @@ public final class ActivityManagerService extends ActivityManagerNative } } - boolean haveActivities = mStackSupervisor.switchUserLocked(userId, uss); - if (!haveActivities) { + boolean homeInFront = mStackSupervisor.switchUserLocked(userId, uss); + if (homeInFront) { startHomeActivityLocked(userId); + } else { + mStackSupervisor.resumeTopActivitiesLocked(); } EventLogTags.writeAmSwitchUser(userId); @@ -16146,6 +16164,8 @@ public final class ActivityManagerService extends ActivityManagerNative } catch (RemoteException e) { } } + + mStackSupervisor.removeUserLocked(userId); } @Override diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java index 2c0b83bef0b8..cf686672a2a3 100644 --- a/services/java/com/android/server/am/ActivityRecord.java +++ b/services/java/com/android/server/am/ActivityRecord.java @@ -572,8 +572,8 @@ final class ActivityRecord { } boolean isRootActivity() { - ArrayList<ActivityRecord> activities = task.mActivities; - return activities.size() == 0 || this == task.mActivities.get(0); + final ArrayList<ActivityRecord> activities = task.mActivities; + return activities.size() == 0 || this == activities.get(0); } UriPermissionOwner getUriPermissionsLocked() { diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 45b30f1cf60a..fc83f050676f 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -549,31 +549,26 @@ final class ActivityStack { /* * Move the activities around in the stack to bring a user to the foreground. - * @return whether there are any activities for the specified user. */ - final boolean switchUserLocked(int userId) { + final void switchUserLocked(int userId) { if (VALIDATE_TOKENS) { validateAppTokensLocked(); } if (mCurrentUser == userId) { - return true; + return; } mCurrentUser = userId; // Move userId's tasks to the top. - boolean haveActivities = false; int index = mTaskHistory.size(); for (int i = 0; i < index; ++i) { TaskRecord task = mTaskHistory.get(i); if (task.userId == userId) { - haveActivities = true; mTaskHistory.remove(i); mTaskHistory.add(task); --index; } } - - return haveActivities; } void minimalResumeActivityLocked(ActivityRecord r) { @@ -678,6 +673,14 @@ final class ActivityStack { return null; } + TaskRecord tr = who.task; + if (tr.intent != null && (tr.intent.getFlags() + &Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0) { + // If this task is being excluded from recents, we don't want to take + // the expense of capturing a thumbnail, since we will never show it. + return null; + } + Resources res = mService.mContext.getResources(); int w = mThumbnailWidth; int h = mThumbnailHeight; @@ -690,6 +693,7 @@ final class ActivityStack { if (w > 0) { if (who != mLastScreenshotActivity || mLastScreenshotBitmap == null + || mLastScreenshotActivity.state == ActivityState.RESUMED || mLastScreenshotBitmap.getWidth() != w || mLastScreenshotBitmap.getHeight() != h) { mLastScreenshotActivity = who; @@ -1092,7 +1096,7 @@ final class ActivityStack { int rIndex = task.mActivities.indexOf(r); for ( --rIndex; rIndex >= 0; --rIndex) { final ActivityRecord blocker = task.mActivities.get(rIndex); - if (!blocker.finishing && blocker.visible) { + if (!blocker.finishing) { if (DEBUG_VISBILITY) Slog.v(TAG, "Home visibility for " + r + " blocked by " + blocker); break; @@ -1623,6 +1627,12 @@ final class ActivityStack { } private void insertTaskAtTop(TaskRecord task) { + // If this is being moved to the top by another activity or being launched from the home + // activity, set mOnTopOfHome accordingly. + final boolean fromHome = mStackSupervisor.getLastStack().isHomeStack(); + if (!isHomeStack() && (fromHome || topTask() != task)) { + task.mOnTopOfHome = fromHome; + } mTaskHistory.remove(task); // Now put task at top. int stackNdx = mTaskHistory.size(); @@ -3421,13 +3431,9 @@ final class ActivityStack { /** * Reset local parameters because an app's activity died. * @param app The app of the activity that died. - * @return true if home should be launched next. + * @return result from removeHistoryRecordsForAppLocked. */ boolean handleAppDiedLocked(ProcessRecord app) { - if (!containsApp(app)) { - return false; - } - if (mPausingActivity != null && mPausingActivity.app == app) { if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG, "App died while pausing: " + mPausingActivity); @@ -3438,30 +3444,7 @@ final class ActivityStack { mLastNoHistoryActivity = null; } - // Determine if the top task is exiting and should return to home. Do this before it gets - // removed in removeHistoryRecordsForAppsLocked. - boolean launchHomeNext = false; - TaskRecord topTask = mTaskHistory.get(mTaskHistory.size() - 1); - ArrayList<ActivityRecord> activities = topTask.mActivities; - int activityNdx; - for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { - ActivityRecord r = activities.get(activityNdx); - if (r.finishing) { - continue; - } - if (r.app != app) { - // This is the dying activity. - break; - } - } - if (activityNdx < 0) { - // All activities in task belong to app. Set launchHomeNext to task's value. - launchHomeNext = topTask.mOnTopOfHome; - } - - removeHistoryRecordsForAppLocked(app); - - return launchHomeNext; + return removeHistoryRecordsForAppLocked(app); } void handleAppCrashLocked(ProcessRecord app) { diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index 2b69a4e16978..b4de258a8051 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -70,6 +70,7 @@ import android.util.EventLog; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.os.TransferPipe; import com.android.server.am.ActivityManagerService.PendingActivityLaunch; @@ -203,6 +204,9 @@ public final class ActivityStackSupervisor { */ final PowerManager.WakeLock mGoingToSleep; + /** State of the stacks when user switched, indexed by userId. */ + SparseBooleanArray mUserHomeInFront = new SparseBooleanArray(2); + public ActivityStackSupervisor(ActivityManagerService service, Context context, Looper looper) { mService = service; @@ -288,22 +292,6 @@ public final class ActivityStackSupervisor { return mService.startHomeActivityLocked(mCurrentUser); } - final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r, - ActivityStack stack) { - if (stack == mHomeStack) { - return; - } - if ((sourceRecord == null && getLastStack() == mHomeStack) || - (sourceRecord != null && sourceRecord.isHomeActivity())) { - if (r == null) { - r = stack.topRunningActivityLocked(null); - } - if (r != null && !r.isHomeActivity() && r.isRootActivity()) { - r.task.mOnTopOfHome = true; - } - } - } - void setDismissKeyguard(boolean dismiss) { if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss); mDismissKeyguardOnNextActivity = dismiss; @@ -1479,7 +1467,6 @@ public final class ActivityStackSupervisor { // is the case, so this is it! And for paranoia, make // sure we have correctly resumed the top activity. if (doResume) { - setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); resumeTopActivitiesLocked(targetStack, null, options); } else { ActivityOptions.abort(options); @@ -1575,9 +1562,6 @@ public final class ActivityStackSupervisor { // don't use that intent!) And for paranoia, make // sure we have correctly resumed the top activity. if (doResume) { - // Reset flag so it gets correctly reevaluated. - intentActivity.task.mOnTopOfHome = false; - setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack); targetStack.resumeTopActivityLocked(null, options); } else { ActivityOptions.abort(options); @@ -1615,7 +1599,6 @@ public final class ActivityStackSupervisor { // resumed the top activity. topStack.mLastPausedActivity = null; if (doResume) { - setLaunchHomeTaskNextFlag(sourceRecord, null, topStack); resumeTopActivitiesLocked(); } ActivityOptions.abort(options); @@ -1694,7 +1677,6 @@ public final class ActivityStackSupervisor { // resumed the top activity. targetStack.mLastPausedActivity = null; if (doResume) { - setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); targetStack.resumeTopActivityLocked(null); } ActivityOptions.abort(options); @@ -1717,7 +1699,6 @@ public final class ActivityStackSupervisor { top.deliverNewIntentLocked(callingUid, r.intent); targetStack.mLastPausedActivity = null; if (doResume) { - setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); targetStack.resumeTopActivityLocked(null); } return ActivityManager.START_DELIVERED_TO_TOP; @@ -1751,7 +1732,6 @@ public final class ActivityStackSupervisor { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); } ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); - setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack); targetStack.mLastPausedActivity = null; targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); mService.setFocusedActivityLocked(r); @@ -1926,30 +1906,12 @@ public final class ActivityStackSupervisor { return r; } - void handleAppDiedLocked(ProcessRecord app, boolean restarting) { - boolean launchHomeTaskNext = false; - final ActivityStack focusedStack = getFocusedStack(); - final int numStacks = mStacks.size(); - for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { - final ActivityStack stack = mStacks.get(stackNdx); - // Only update launchHomeTaskNext for the focused stack. - launchHomeTaskNext |= (stack.handleAppDiedLocked(app) && stack == focusedStack); - } - - if (!restarting) { - if (launchHomeTaskNext) { - resumeHomeActivity(null); - } else { - if (!resumeTopActivitiesLocked(focusedStack, null, null)) { - // If there was nothing to resume, and we are not already - // restarting this process, but there is a visible activity that - // is hosted by the process... then make sure all visible - // activities are running, taking care of restarting this - // process. - ensureActivitiesVisibleLocked(null, 0); - } - } + boolean handleAppDiedLocked(ProcessRecord app, boolean restarting) { + boolean hasVisibleActivities = false; + for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { + hasVisibleActivities |= mStacks.get(stackNdx).handleAppDiedLocked(app); } + return hasVisibleActivities; } void closeSystemDialogsLocked() { @@ -1960,6 +1922,10 @@ public final class ActivityStackSupervisor { } } + void removeUserLocked(int userId) { + mUserHomeInFront.delete(userId); + } + /** * @return true if some activity was finished (or would have finished if doit were true). */ @@ -2278,17 +2244,17 @@ public final class ActivityStackSupervisor { } boolean switchUserLocked(int userId, UserStartedState uss) { + mUserHomeInFront.put(mCurrentUser, isFrontStack(mHomeStack)); + final boolean homeInFront = mUserHomeInFront.get(userId, true); mCurrentUser = userId; mStartingUsers.add(uss); - boolean haveActivities = false; for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { - haveActivities |= mStacks.get(stackNdx).switchUserLocked(userId); + mStacks.get(stackNdx).switchUserLocked(userId); } - resumeTopActivitiesLocked(); - - return haveActivities; + moveHomeStack(homeInFront); + return homeInFront; } final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { @@ -2381,6 +2347,7 @@ public final class ActivityStackSupervisor { pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState)); pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout); pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId); + pw.print(prefix); pw.println("mUserHomeInFront: " + mUserHomeInFront); } ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java index 385253ef5bce..3d568ffb8e07 100644 --- a/services/java/com/android/server/am/TaskRecord.java +++ b/services/java/com/android/server/am/TaskRecord.java @@ -128,6 +128,16 @@ final class TaskRecord extends ThumbnailHolder { } } + void disposeThumbnail() { + super.disposeThumbnail(); + for (int i=mActivities.size()-1; i>=0; i--) { + ThumbnailHolder thumb = mActivities.get(i).thumbHolder; + if (thumb != this) { + thumb.disposeThumbnail(); + } + } + } + ActivityRecord getTopActivity() { for (int i = mActivities.size() - 1; i >= 0; --i) { final ActivityRecord r = mActivities.get(i); diff --git a/services/java/com/android/server/am/ThumbnailHolder.java b/services/java/com/android/server/am/ThumbnailHolder.java index 02f4fcbf1a7c..a6974f56356d 100644 --- a/services/java/com/android/server/am/ThumbnailHolder.java +++ b/services/java/com/android/server/am/ThumbnailHolder.java @@ -21,4 +21,9 @@ import android.graphics.Bitmap; public class ThumbnailHolder { Bitmap lastThumbnail; // Last thumbnail captured for this item. CharSequence lastDescription; // Last description captured for this item. + + void disposeThumbnail() { + lastThumbnail = null; + lastDescription = null; + } } diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index f093f2bd2690..fb6e9edcbb6c 100755 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -383,13 +383,12 @@ public class PackageManagerService extends IPackageManager.Stub { // All available services, for your resolving pleasure. final ServiceIntentResolver mServices = new ServiceIntentResolver(); - // Keys are String (provider class name), values are Provider. - final HashMap<ComponentName, PackageParser.Provider> mProvidersByComponent = - new HashMap<ComponentName, PackageParser.Provider>(); + // All available providers, for your resolving pleasure. + final ProviderIntentResolver mProviders = new ProviderIntentResolver(); // Mapping from provider base names (first directory in content URI codePath) // to the provider information. - final HashMap<String, PackageParser.Provider> mProviders = + final HashMap<String, PackageParser.Provider> mProvidersByAuthority = new HashMap<String, PackageParser.Provider>(); // Mapping from instrumentation class names to info about them. @@ -850,6 +849,19 @@ public class PackageManagerService extends IPackageManager.Stub { sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null, null, res.pkg.applicationInfo.packageName, null, updateUsers); + + // treat asec-hosted packages like removable media on upgrade + if (isForwardLocked(res.pkg) || isExternal(res.pkg)) { + if (DEBUG_INSTALL) { + Slog.i(TAG, "upgrading pkg " + res.pkg + + " is ASEC-hosted -> AVAILABLE"); + } + int[] uidArray = new int[] { res.pkg.applicationInfo.uid }; + ArrayList<String> pkgList = new ArrayList<String>(1); + pkgList.add(res.pkg.applicationInfo.packageName); + sendResourcesChangedBroadcast(true, false, + pkgList,uidArray, null); + } } if (res.removedInfo.args != null) { // Remove the replaced package's older resources safely now @@ -2082,7 +2094,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!sUserManager.exists(userId)) return null; enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "get provider info"); synchronized (mPackages) { - PackageParser.Provider p = mProvidersByComponent.get(component); + PackageParser.Provider p = mProviders.mProviders.get(component); if (DEBUG_PACKAGE_INFO) Log.v( TAG, "getProviderInfo " + component + ": " + p); if (p != null && mSettings.isEnabledLPr(p.info, flags, userId)) { @@ -3108,6 +3120,43 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public List<ResolveInfo> queryIntentContentProviders( + Intent intent, String resolvedType, int flags, int userId) { + if (!sUserManager.exists(userId)) return Collections.emptyList(); + ComponentName comp = intent.getComponent(); + if (comp == null) { + if (intent.getSelector() != null) { + intent = intent.getSelector(); + comp = intent.getComponent(); + } + } + if (comp != null) { + final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1); + final ProviderInfo pi = getProviderInfo(comp, flags, userId); + if (pi != null) { + final ResolveInfo ri = new ResolveInfo(); + ri.providerInfo = pi; + list.add(ri); + } + return list; + } + + // reader + synchronized (mPackages) { + String pkgName = intent.getPackage(); + if (pkgName == null) { + return mProviders.queryIntent(intent, resolvedType, flags, userId); + } + final PackageParser.Package pkg = mPackages.get(pkgName); + if (pkg != null) { + return mProviders.queryIntentForPackage( + intent, resolvedType, flags, pkg.providers, userId); + } + return null; + } + } + + @Override public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) { final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; @@ -3280,7 +3329,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!sUserManager.exists(userId)) return null; // reader synchronized (mPackages) { - final PackageParser.Provider provider = mProviders.get(name); + final PackageParser.Provider provider = mProvidersByAuthority.get(name); PackageSetting ps = provider != null ? mSettings.mPackages.get(provider.owner.packageName) : null; @@ -3301,8 +3350,8 @@ public class PackageManagerService extends IPackageManager.Stub { public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) { // reader synchronized (mPackages) { - final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProviders.entrySet() - .iterator(); + final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProvidersByAuthority + .entrySet().iterator(); final int userId = UserHandle.getCallingUserId(); while (i.hasNext()) { Map.Entry<String, PackageParser.Provider> entry = i.next(); @@ -3328,7 +3377,7 @@ public class PackageManagerService extends IPackageManager.Stub { ArrayList<ProviderInfo> finalList = null; // reader synchronized (mPackages) { - final Iterator<PackageParser.Provider> i = mProvidersByComponent.values().iterator(); + final Iterator<PackageParser.Provider> i = mProviders.mProviders.values().iterator(); final int userId = processName != null ? UserHandle.getUserId(uid) : UserHandle.getCallingUserId(); while (i.hasNext()) { @@ -4300,8 +4349,8 @@ public class PackageManagerService extends IPackageManager.Stub { if (p.info.authority != null) { String names[] = p.info.authority.split(";"); for (int j = 0; j < names.length; j++) { - if (mProviders.containsKey(names[j])) { - PackageParser.Provider other = mProviders.get(names[j]); + if (mProvidersByAuthority.containsKey(names[j])) { + PackageParser.Provider other = mProvidersByAuthority.get(names[j]); Slog.w(TAG, "Can't install because provider name " + names[j] + " (in package " + pkg.applicationInfo.packageName + ") is already used by " @@ -4643,6 +4692,20 @@ public class PackageManagerService extends IPackageManager.Stub { // so that we do not end up in a confused state while the user is still using the older // version of the application while the new one gets installed. if ((parseFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) { + // If the package lives in an asec, tell everyone that the container is going + // away so they can clean up any references to its resources (which would prevent + // vold from being able to unmount the asec) + if (isForwardLocked(pkg) || isExternal(pkg)) { + if (DEBUG_INSTALL) { + Slog.i(TAG, "upgrading pkg " + pkg + " is ASEC-hosted -> UNAVAILABLE"); + } + final int[] uidArray = new int[] { pkg.applicationInfo.uid }; + final ArrayList<String> pkgList = new ArrayList<String>(1); + pkgList.add(pkg.applicationInfo.packageName); + sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null); + } + + // Post the request that it be killed now that the going-away broadcast is en route killApplication(pkg.applicationInfo.packageName, pkg.applicationInfo.uid, "update pkg"); } @@ -4718,8 +4781,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.Provider p = pkg.providers.get(i); p.info.processName = fixProcessName(pkg.applicationInfo.processName, p.info.processName, pkg.applicationInfo.uid); - mProvidersByComponent.put(new ComponentName(p.info.packageName, - p.info.name), p); + mProviders.addProvider(p); p.syncable = p.info.isSyncable; if (p.info.authority != null) { String names[] = p.info.authority.split(";"); @@ -4736,8 +4798,8 @@ public class PackageManagerService extends IPackageManager.Stub { p = new PackageParser.Provider(p); p.syncable = false; } - if (!mProviders.containsKey(names[j])) { - mProviders.put(names[j], p); + if (!mProvidersByAuthority.containsKey(names[j])) { + mProvidersByAuthority.put(names[j], p); if (p.info.authority == null) { p.info.authority = names[j]; } else { @@ -4750,7 +4812,7 @@ public class PackageManagerService extends IPackageManager.Stub { + p.info.isSyncable); } } else { - PackageParser.Provider other = mProviders.get(names[j]); + PackageParser.Provider other = mProvidersByAuthority.get(names[j]); Slog.w(TAG, "Skipping provider name " + names[j] + " (in package " + pkg.applicationInfo.packageName + "): name already used by " @@ -5081,8 +5143,7 @@ public class PackageManagerService extends IPackageManager.Stub { int i; for (i=0; i<N; i++) { PackageParser.Provider p = pkg.providers.get(i); - mProvidersByComponent.remove(new ComponentName(p.info.packageName, - p.info.name)); + mProviders.removeProvider(p); if (p.info.authority == null) { /* There was another ContentProvider with this authority when @@ -5093,8 +5154,8 @@ public class PackageManagerService extends IPackageManager.Stub { } String names[] = p.info.authority.split(";"); for (int j = 0; j < names.length; j++) { - if (mProviders.get(names[j]) == p) { - mProviders.remove(names[j]); + if (mProvidersByAuthority.get(names[j]) == p) { + mProvidersByAuthority.remove(names[j]); if (DEBUG_REMOVE) { if (chatty) Log.d(TAG, "Unregistered content provider: " + names[j] @@ -5935,6 +5996,195 @@ public class PackageManagerService extends IPackageManager.Stub { private int mFlags; }; + private final class ProviderIntentResolver + extends IntentResolver<PackageParser.ProviderIntentInfo, ResolveInfo> { + public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, + boolean defaultOnly, int userId) { + mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0; + return super.queryIntent(intent, resolvedType, defaultOnly, userId); + } + + public List<ResolveInfo> queryIntent(Intent intent, String resolvedType, int flags, + int userId) { + if (!sUserManager.exists(userId)) + return null; + mFlags = flags; + return super.queryIntent(intent, resolvedType, + (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId); + } + + public List<ResolveInfo> queryIntentForPackage(Intent intent, String resolvedType, + int flags, ArrayList<PackageParser.Provider> packageProviders, int userId) { + if (!sUserManager.exists(userId)) + return null; + if (packageProviders == null) { + return null; + } + mFlags = flags; + final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0; + final int N = packageProviders.size(); + ArrayList<PackageParser.ProviderIntentInfo[]> listCut = + new ArrayList<PackageParser.ProviderIntentInfo[]>(N); + + ArrayList<PackageParser.ProviderIntentInfo> intentFilters; + for (int i = 0; i < N; ++i) { + intentFilters = packageProviders.get(i).intents; + if (intentFilters != null && intentFilters.size() > 0) { + PackageParser.ProviderIntentInfo[] array = + new PackageParser.ProviderIntentInfo[intentFilters.size()]; + intentFilters.toArray(array); + listCut.add(array); + } + } + return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId); + } + + public final void addProvider(PackageParser.Provider p) { + mProviders.put(p.getComponentName(), p); + if (DEBUG_SHOW_INFO) { + Log.v(TAG, " " + + (p.info.nonLocalizedLabel != null + ? p.info.nonLocalizedLabel : p.info.name) + ":"); + Log.v(TAG, " Class=" + p.info.name); + } + final int NI = p.intents.size(); + int j; + for (j = 0; j < NI; j++) { + PackageParser.ProviderIntentInfo intent = p.intents.get(j); + if (DEBUG_SHOW_INFO) { + Log.v(TAG, " IntentFilter:"); + intent.dump(new LogPrinter(Log.VERBOSE, TAG), " "); + } + if (!intent.debugCheck()) { + Log.w(TAG, "==> For Provider " + p.info.name); + } + addFilter(intent); + } + } + + public final void removeProvider(PackageParser.Provider p) { + mProviders.remove(p.getComponentName()); + if (DEBUG_SHOW_INFO) { + Log.v(TAG, " " + (p.info.nonLocalizedLabel != null + ? p.info.nonLocalizedLabel : p.info.name) + ":"); + Log.v(TAG, " Class=" + p.info.name); + } + final int NI = p.intents.size(); + int j; + for (j = 0; j < NI; j++) { + PackageParser.ProviderIntentInfo intent = p.intents.get(j); + if (DEBUG_SHOW_INFO) { + Log.v(TAG, " IntentFilter:"); + intent.dump(new LogPrinter(Log.VERBOSE, TAG), " "); + } + removeFilter(intent); + } + } + + @Override + protected boolean allowFilterResult( + PackageParser.ProviderIntentInfo filter, List<ResolveInfo> dest) { + ProviderInfo filterPi = filter.provider.info; + for (int i = dest.size() - 1; i >= 0; i--) { + ProviderInfo destPi = dest.get(i).providerInfo; + if (destPi.name == filterPi.name + && destPi.packageName == filterPi.packageName) { + return false; + } + } + return true; + } + + @Override + protected PackageParser.ProviderIntentInfo[] newArray(int size) { + return new PackageParser.ProviderIntentInfo[size]; + } + + @Override + protected boolean isFilterStopped(PackageParser.ProviderIntentInfo filter, int userId) { + if (!sUserManager.exists(userId)) + return true; + PackageParser.Package p = filter.provider.owner; + if (p != null) { + PackageSetting ps = (PackageSetting) p.mExtras; + if (ps != null) { + // System apps are never considered stopped for purposes of + // filtering, because there may be no way for the user to + // actually re-launch them. + return (ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0 + && ps.getStopped(userId); + } + } + return false; + } + + @Override + protected boolean isPackageForFilter(String packageName, + PackageParser.ProviderIntentInfo info) { + return packageName.equals(info.provider.owner.packageName); + } + + @Override + protected ResolveInfo newResult(PackageParser.ProviderIntentInfo filter, + int match, int userId) { + if (!sUserManager.exists(userId)) + return null; + final PackageParser.ProviderIntentInfo info = filter; + if (!mSettings.isEnabledLPr(info.provider.info, mFlags, userId)) { + return null; + } + final PackageParser.Provider provider = info.provider; + if (mSafeMode && (provider.info.applicationInfo.flags + & ApplicationInfo.FLAG_SYSTEM) == 0) { + return null; + } + PackageSetting ps = (PackageSetting) provider.owner.mExtras; + if (ps == null) { + return null; + } + ProviderInfo pi = PackageParser.generateProviderInfo(provider, mFlags, + ps.readUserState(userId), userId); + if (pi == null) { + return null; + } + final ResolveInfo res = new ResolveInfo(); + res.providerInfo = pi; + if ((mFlags & PackageManager.GET_RESOLVED_FILTER) != 0) { + res.filter = filter; + } + res.priority = info.getPriority(); + res.preferredOrder = provider.owner.mPreferredOrder; + res.match = match; + res.isDefault = info.hasDefault; + res.labelRes = info.labelRes; + res.nonLocalizedLabel = info.nonLocalizedLabel; + res.icon = info.icon; + res.system = isSystemApp(res.providerInfo.applicationInfo); + return res; + } + + @Override + protected void sortResults(List<ResolveInfo> results) { + Collections.sort(results, mResolvePrioritySorter); + } + + @Override + protected void dumpFilter(PrintWriter out, String prefix, + PackageParser.ProviderIntentInfo filter) { + out.print(prefix); + out.print( + Integer.toHexString(System.identityHashCode(filter.provider))); + out.print(' '); + filter.provider.printComponentShortName(out); + out.print(" filter "); + out.println(Integer.toHexString(System.identityHashCode(filter))); + } + + private final HashMap<ComponentName, PackageParser.Provider> mProviders + = new HashMap<ComponentName, PackageParser.Provider>(); + private int mFlags; + }; + private static final Comparator<ResolveInfo> mResolvePrioritySorter = new Comparator<ResolveInfo>() { public int compare(ResolveInfo r1, ResolveInfo r2) { @@ -9120,6 +9370,17 @@ public class PackageManagerService extends IPackageManager.Stub { } } + boolean locationIsPrivileged(File path) { + try { + final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app") + .getCanonicalPath(); + return path.getCanonicalPath().startsWith(privilegedAppDir); + } catch (IOException e) { + Slog.e(TAG, "Unable to access code path " + path); + } + return false; + } + /* * Tries to delete system package. */ @@ -9175,9 +9436,12 @@ public class PackageManagerService extends IPackageManager.Stub { } // Install the system package if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); + int parseFlags = PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM; + if (locationIsPrivileged(disabledPs.codePath)) { + parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; + } PackageParser.Package newPkg = scanPackageLI(disabledPs.codePath, - PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM, - SCAN_MONITOR | SCAN_NO_PATHS, 0, null); + parseFlags, SCAN_MONITOR | SCAN_NO_PATHS, 0, null); if (newPkg == null) { Slog.w(TAG, "Failed to restore system package:" + newPs.name @@ -10413,6 +10677,11 @@ public class PackageManagerService extends IPackageManager.Stub { dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { dumpState.setTitlePrinted(true); } + if (mProviders.dump(pw, dumpState.getTitlePrinted() ? "\nProvider Resolver Table:" + : "Provider Resolver Table:", " ", packageName, + dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { + dumpState.setTitlePrinted(true); + } } if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { @@ -10457,7 +10726,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (dumpState.isDumping(DumpState.DUMP_PROVIDERS)) { boolean printedSomething = false; - for (PackageParser.Provider p : mProvidersByComponent.values()) { + for (PackageParser.Provider p : mProviders.mProviders.values()) { if (packageName != null && !packageName.equals(p.info.packageName)) { continue; } @@ -10471,7 +10740,8 @@ public class PackageManagerService extends IPackageManager.Stub { pw.print(" "); pw.println(p.toString()); } printedSomething = false; - for (Map.Entry<String, PackageParser.Provider> entry : mProviders.entrySet()) { + for (Map.Entry<String, PackageParser.Provider> entry : + mProvidersByAuthority.entrySet()) { PackageParser.Provider p = entry.getValue(); if (packageName != null && !packageName.equals(p.info.packageName)) { continue; @@ -10731,8 +11001,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private void sendResourcesChangedBroadcast(boolean mediaStatus, ArrayList<String> pkgList, - int uidArr[], IIntentReceiver finishedReceiver) { + private void sendResourcesChangedBroadcast(boolean mediaStatus, boolean replacing, + ArrayList<String> pkgList, int uidArr[], IIntentReceiver finishedReceiver) { int size = pkgList.size(); if (size > 0) { // Send broadcasts here @@ -10742,6 +11012,9 @@ public class PackageManagerService extends IPackageManager.Stub { if (uidArr != null) { extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidArr); } + if (replacing && !mediaStatus) { + extras.putBoolean(Intent.EXTRA_REPLACING, replacing); + } String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE; sendPackageBroadcast(action, null, extras, null, finishedReceiver, null); @@ -10844,7 +11117,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Send a broadcast to let everyone know we are done processing if (pkgList.size() > 0) { - sendResourcesChangedBroadcast(true, pkgList, uidArr, null); + sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null); } // Force gc to avoid any stale parser references that we might have. if (doGc) { @@ -10921,7 +11194,8 @@ public class PackageManagerService extends IPackageManager.Stub { // broadcast when packages get disabled, force a gc to clean things up. // and unload all the containers. if (pkgList.size() > 0) { - sendResourcesChangedBroadcast(false, pkgList, uidArr, new IIntentReceiver.Stub() { + sendResourcesChangedBroadcast(false, false, pkgList, uidArr, + new IIntentReceiver.Stub() { public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) throws RemoteException { @@ -11041,7 +11315,7 @@ public class PackageManagerService extends IPackageManager.Stub { } if (returnCode == PackageManager.MOVE_SUCCEEDED) { // Send resources unavailable broadcast - sendResourcesChangedBroadcast(false, pkgList, uidArr, null); + sendResourcesChangedBroadcast(false, true, pkgList, uidArr, null); // Update package code and resource paths synchronized (mInstallLock) { synchronized (mPackages) { @@ -11119,7 +11393,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } // Send resources available broadcast - sendResourcesChangedBroadcast(true, pkgList, uidArr, null); + sendResourcesChangedBroadcast(true, false, pkgList, uidArr, null); } } if (returnCode != PackageManager.MOVE_SUCCEEDED) { diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index 3b0ee24faa43..b3f003639c1b 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -205,6 +205,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { for (int i = 0; i < cachedPrintJobCount; i++) { PrintJobInfo cachedPrintJob = cachedPrintJobs.get(i); result.put(cachedPrintJob.getId(), cachedPrintJob); + // Strip out the tag - it is visible only to print services. + // Also the cached print jobs are delivered only to apps, so + // stripping the tag of a cached print job is fine. + cachedPrintJob.setTag(null); } // Add everything else the spooler knows about. @@ -215,6 +219,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { for (int i = 0; i < printJobCount; i++) { PrintJobInfo printJob = printJobs.get(i); result.put(printJob.getId(), printJob); + // Strip out the tag - it is visible only to print services. + printJob.setTag(null); } } diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 5f944f6107f5..661bd41632bc 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -282,6 +282,18 @@ public class MockPackageManager extends PackageManager { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public List<ResolveInfo> queryIntentContentProvidersAsUser( + Intent intent, int flags, int userId) { + throw new UnsupportedOperationException(); + } + + @Override + public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) { + throw new UnsupportedOperationException(); + } + @Override public ProviderInfo resolveContentProvider(String name, int flags) { throw new UnsupportedOperationException(); diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 52ebaf0f7775..f2e525481399 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -636,6 +636,30 @@ bool isInProductList(const String16& needle, const String16& haystack) { return false; } +/* + * A simple container that holds a resource type and name. It is ordered first by type then + * by name. + */ +struct type_ident_pair_t { + String16 type; + String16 ident; + + type_ident_pair_t() { }; + type_ident_pair_t(const String16& t, const String16& i) : type(t), ident(i) { } + type_ident_pair_t(const type_ident_pair_t& o) : type(o.type), ident(o.ident) { } + inline bool operator < (const type_ident_pair_t& o) const { + int cmp = compare_type(type, o.type); + if (cmp < 0) { + return true; + } else if (cmp > 0) { + return false; + } else { + return strictly_order_type(ident, o.ident); + } + } +}; + + status_t parseAndAddEntry(Bundle* bundle, const sp<AaptFile>& in, ResXMLTree* block, @@ -650,6 +674,7 @@ status_t parseAndAddEntry(Bundle* bundle, const String16& product, bool pseudolocalize, const bool overwrite, + KeyedVector<type_ident_pair_t, bool>* skippedResourceNames, ResourceTable* outTable) { status_t err; @@ -684,6 +709,13 @@ status_t parseAndAddEntry(Bundle* bundle, if (bundleProduct[0] == '\0') { if (strcmp16(String16("default").string(), product.string()) != 0) { + /* + * This string has a product other than 'default'. Do not add it, + * but record it so that if we do not see the same string with + * product 'default' or no product, then report an error. + */ + skippedResourceNames->replaceValueFor( + type_ident_pair_t(curType, ident), true); return NO_ERROR; } } else { @@ -797,6 +829,11 @@ status_t compileResourceFile(Bundle* bundle, DefaultKeyedVector<String16, uint32_t> nextPublicId(0); + // Stores the resource names that were skipped. Typically this happens when + // AAPT is invoked without a product specified and a resource has no + // 'default' product attribute. + KeyedVector<type_ident_pair_t, bool> skippedResourceNames; + ResXMLTree::event_code_t code; do { code = block.next(); @@ -1544,7 +1581,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, - product, false, overwrite, outTable); + product, false, overwrite, &skippedResourceNames, outTable); if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR? hasErrors = localHasErrors = true; @@ -1557,7 +1594,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, product, - true, overwrite, outTable); + true, overwrite, &skippedResourceNames, outTable); if (err != NO_ERROR) { hasErrors = localHasErrors = true; } @@ -1596,6 +1633,30 @@ status_t compileResourceFile(Bundle* bundle, } } + // For every resource defined, there must be exist one variant with a product attribute + // set to 'default' (or no product attribute at all). + // We check to see that for every resource that was ignored because of a mismatched + // product attribute, some product variant of that resource was processed. + for (size_t i = 0; i < skippedResourceNames.size(); i++) { + if (skippedResourceNames[i]) { + const type_ident_pair_t& p = skippedResourceNames.keyAt(i); + if (!outTable->hasBagOrEntry(myPackage, p.type, p.ident)) { + const char* bundleProduct = + (bundle->getProduct() == NULL) ? "" : bundle->getProduct(); + fprintf(stderr, "In resource file %s: %s\n", + in->getPrintableSource().string(), + curParams.toString().string()); + + fprintf(stderr, "\t%s '%s' does not match product %s.\n" + "\tYou may have forgotten to include a 'default' product variant" + " of the resource.\n", + String8(p.type).string(), String8(p.ident).string(), + bundleProduct[0] == 0 ? "default" : bundleProduct); + return UNKNOWN_ERROR; + } + } + } + return hasErrors ? UNKNOWN_ERROR : NO_ERROR; } @@ -2483,8 +2544,8 @@ status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols) { String16 comment(c->getComment()); typeSymbols->appendComment(String8(c->getName()), comment, c->getPos()); - //printf("Type symbol %s comment: %s\n", String8(e->getName()).string(), - // String8(comment).string()); + //printf("Type symbol [%08x] %s comment: %s\n", rid, + // String8(c->getName()).string(), String8(comment).string()); comment = c->getTypeComment(); typeSymbols->appendTypeComment(String8(c->getName()), comment); } else { |